嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" Z1 l1 B2 q& R  j) i4 M7 N4 [: c$ Y
- Y: E* w1 q1 U. U" p) k7 aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* p( f. N1 V/ S' C4 s
#include <unistd.h>- p$ h4 |/ F% k1 P7 w$ g; D% F
#include <sys/mman.h>/ ?5 ~/ g( l$ q. p) M+ B
#include <sys/types.h>: r3 b4 q% n/ Y
#include <fcntl.h>
* V4 L. z" Y) D, j) F; J9 u6 h( \7 W* J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 k0 o" e, @5 E6 |& B1 J& r8 x

& N3 g- s4 ?* A3 j6 R1 U: q3 xtypedef struct
8 i# D. q! K3 f% J{" Q4 S+ u& l* c0 Q" G
        unsigned int a;
( Z/ @# I- g2 x- z8 Y        unsigned int b;* m; p; T7 L: H: `
        unsigned int packet_cout;
& `4 z4 I4 ~+ |; ?! R0 x! |! ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! o6 G* f$ w( g/ ]5 O6 Q5 }0 M, c% X8 B/ n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- u0 `6 x& |2 G9 U; }unsigned int count_copy = 0;
# S; {/ k/ {! X9 T4 @5 A3 \( E) F' l
& c, l% m4 w0 h' d& E( I
int main()+ r# j& k; }- S. F
{, a" N& |$ C5 t6 P0 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' q0 g! `' P; }" L- _# {* ^0 A# U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" p9 X2 ^( ~; P* v2 D, A& o
! M1 x% Q7 z8 P; O0 Z* H( e
        while(1)
) _# t  I8 l/ Q& a8 m$ Q2 H* c        {1 j, ~8 w9 V8 o* X
                read_MSG_buffer(pshreRAM);
4 ^7 d4 V! D6 V) M1 _) z        }               
9 e0 x7 ~, J: ]* x& n. T}
3 K: x: r1 Q# x
  K5 s' l9 e+ S) @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 z: o8 ]. ?' y. e5 i
{2 }7 g: w4 K( G
        RX_MSG_PROTOCOL buf;
; i" K7 K$ \" ~5 |0 l8 V        * p: f& e0 O. ?
        buf.a = pshreRAM->a;
& p3 K  P# P( ^4 x& g. J( h3 N        buf.b = pshreRAM->b;
9 ?! ^9 V0 l( m$ S8 l        buf.packet_cout = pshreRAM->packet_cout;
- Y) w. ]. P/ v* {0 v        
0 G7 A' h/ t; I3 C) H# X. x        if(buf.packet_cout != count_copy)
1 ^4 q7 m- K5 V& O, \3 p        {' J' y. Z" F) M* {4 r1 q( L' n9 i9 Q
                printf("a is %d\n", buf.a);8 d7 _- K" `  j3 e. P" P: `
                printf("b is %d\n", buf.b);
; Z+ c) P3 `- o' g, P4 A) Z                printf("count is %d\n", buf.packet_cout);, k& d* I0 ], B+ p: n: y) l
                count_copy = buf.packet_cout;0 C8 y0 B5 R; ^# f; @' ~
        }3 R# b6 I1 j5 p( [8 k
        else- N8 }+ Y4 D; ?  b$ j  c
        {
* H, c  \4 `! Z2 Z                printf("No effective message!");7 A+ |( v& U. s# R
        }
( v" c6 F& b2 z2 m0 ^}
: a  ~% @, t, T  z. M8 V/ A' W
5 G2 V7 z1 s( O8 V/ j6 n, X5 N9 f/ w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。7 W  U; Q' x* w9 i
使用下面代码,对内存使用了mmap函数后:
, H0 `8 f: ?. a; {#include <stdio.h>
! A6 Z$ t. u; ^7 j& c5 }#include <unistd.h>
8 w/ E+ x4 Q3 b+ l$ P#include <sys/mman.h>
% x: S' }! k0 g2 E& X#include <sys/types.h>! a4 L; K5 I* d. [/ h- b% b
#include <fcntl.h>
/ C# q; h) E: ~# L2 K# }
/ g; N5 T8 e( _#define SHAER_RAM_BASE_ADDR    (0x80000000)# e4 R: t  t% c" d# H: q9 J6 t
#define SHAER_RAM_SIZE         (0x20000)   
- \2 B  y+ C7 H3 P( D) o7 m3 M
; a. {/ L( V5 g$ K4 _; g' b" B: Wtypedef struct
6 ^7 B. \5 c1 |8 h7 p) g{
$ z) p; }$ i- I) o( @- U        unsigned int a;
' O+ s1 T; N. C5 `: ?1 P# j( t        unsigned int b;: c0 u$ _8 p3 N
        unsigned int packet_cout;. q7 `/ ]" r+ k# W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& s. |$ A5 A- A+ n. P* f5 @

$ \6 u1 \6 B) i5 C& `7 t' S0 h# b+ avoid read_MSG_buffer(int *baseaddr);5 I6 e+ g! q$ n; k+ F, @
unsigned int count_copy = 0;
! z: M6 [& [/ {! Q
! a  a. x. \. cint main()
; @, l. G4 @$ p9 L- ~0 [{6 W/ G0 N0 i8 S9 l" y! U
        int fd;
- k+ v' V2 d$ F6 S1 ^' K) \8 v        int *mem = NULL;
1 a! F7 ?1 o0 H) b! Y  K4 P$ O6 z2 Z/ l8 A" p
        if((fd = open("/dev/mem", O_RDWR)) <0)% q. Y6 Z8 T: }9 w" h4 b+ ~. n
        {
, |" ~2 N$ J1 p2 u" ~" T$ W                perror("open error");
% Y/ r" p- N. [( H                return -1;/ d3 g# J# i$ u. [
        }
0 {2 u# ?7 y! m) ?+ T        8 p4 M5 N) v, Q* d: F# t
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" [6 `% t6 R: E8 D" a7 {9 `( z8 S- M# w  V& Y) x/ Q5 k
        while(1)( I# g; U4 |# k) T( w7 C
        {
& R( t6 o* B7 b1 z. O5 {& |6 W                read_MSG_buffer(mem);
+ ?0 P9 [1 T% J$ t0 @" ?1 n        }                ) t3 w9 a9 ]4 |0 N3 @7 b# w/ k( i
}
( I7 T, `8 D6 n  V2 u4 L" P, m+ n$ s; @: t) P
void read_MSG_buffer(int *baseaddr); T" a! f. r( [
{
  ~% ]* r% v6 x9 x        pRX_MSG_PROTOCOL pshreRAM = NULL;& g- I3 @$ W! T

! M- r, q: ~, t- b% ~        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. Y; |* A6 p4 z  n' `# u) \

. k% s3 ~: P' y3 S9 G        if(pshreRAM->packet_cout != count_copy)
  H/ `+ {. j2 T' t+ P/ E; d        {
9 P# l. r$ u, }. ^8 D1 A                printf("a is %d\n", pshreRAM->a);
$ s% v8 ]9 T% d) q( h1 M  M  B& \                printf("b is %d\n", pshreRAM->b);: L8 j  U7 X9 m! }. i
                printf("count is %d\n", pshreRAM->packet_cout);& t5 H3 L5 V% l+ C9 v7 E# {
                count_copy = pshreRAM->packet_cout;
; o9 n) L& n0 |! Y5 i  O) R        }
/ K: |4 b2 I5 T9 g* }5 \# z        else0 l1 r5 s9 W& r# N" M
        {
1 `2 e' G3 p& |1 j  j; e+ P$ Y                printf("No effective message!\n");
) K* B+ b- r- E) n: S* I9 {  K. f        }
4 ^3 ^. a$ d/ N6 X; C, f2 ~2 S- B8 P9 H}
) |6 b9 C2 F1 W9 n2 r$ N6 `* e
% c6 [/ }0 D0 L7 `  a3 J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; G% l5 H# Y& e: g* j# ]2 g5 Z

( I8 T' v7 }5 E2 I: L7 u7 a
5 F! W7 K4 u% i5 o' _4 ~1 I: k# ]





欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4