嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( `- H  w% Q4 \2 t& g1 q9 M
" C! K( X" V& K! J1 M+ g
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) f: m$ [( n* K2 U! `6 ?" `4 X
#include <unistd.h>
! V6 S, V; }; m0 q8 {" U+ u6 _( b#include <sys/mman.h>- t5 N! U0 H7 j. }
#include <sys/types.h>
2 O% {$ D7 q* ?* t8 K#include <fcntl.h>7 k' n! t/ {5 g0 D3 P: T4 K) [
& H# ]( f/ K5 m! r# O6 g4 A; U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ v4 J. ]9 R% B3 c! M0 h; m3 C7 |" \1 p. K" }" F$ F+ J# T$ p
typedef struct
1 c7 D& I1 f* K+ _{4 h. a3 i1 F0 f& }1 m
        unsigned int a;; L8 N8 y  A3 I5 f  m3 P* z
        unsigned int b;' ?+ k0 {" [8 d1 C
        unsigned int packet_cout;  c! c1 k' J8 Y  ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( h! S0 j. i1 O8 S/ p# a: g" F( {% A& t! J2 o4 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! {+ k7 [9 U, a$ u( @- V) e6 o( c# ounsigned int count_copy = 0;5 }/ L) x4 K! U. U7 s/ N

+ W: T7 A. A4 [5 F  B+ X8 O% g# {2 g3 ^: x
int main()& a5 M) {4 s8 w* T: U2 a
{6 Q' v$ B- Y# b, I( J. T
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) h% ]' T# k7 s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! T& r  R5 d9 P, w- Q. F6 O

  x) g2 L+ f" `9 \5 z; M( l        while(1)% u: s6 c6 b+ Z, g
        {
, J% }1 W  E; d! n& N2 z                read_MSG_buffer(pshreRAM);
. N( n5 h+ X' r- u' _. J7 o        }                " d% \1 L  o. l- `
}
1 c7 M$ t$ s6 a. F  v
! o9 p& j$ F$ Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, c/ D, ~# D$ D6 c{
1 _3 t: R; q/ ]9 M        RX_MSG_PROTOCOL buf;. S9 F$ j7 u- n/ H) J2 k$ n
        $ }1 `- m; [( H: Q# E- ~
        buf.a = pshreRAM->a;
9 {6 k9 A! U" h6 }& Q        buf.b = pshreRAM->b;/ Q5 d, {& ^; C! _9 ^, }+ S) j
        buf.packet_cout = pshreRAM->packet_cout;( v( y" c( y8 B: r' l& J9 m
        
1 V% N1 m4 [1 M- v        if(buf.packet_cout != count_copy)
& o1 z; {' ^! [3 n% X3 R        {8 H0 c6 y) ^+ [
                printf("a is %d\n", buf.a);
6 U$ |/ l6 J: d6 |                printf("b is %d\n", buf.b);
9 t& U/ ]4 r% K                printf("count is %d\n", buf.packet_cout);
2 I$ Y* z" ~4 u                count_copy = buf.packet_cout;( I3 I7 c$ D& W
        }
$ \" D- d$ v  }* t3 V! e7 E        else
' ^$ |( U! \2 z+ L. v        {$ X/ ~) a& f) U- _3 G9 [
                printf("No effective message!");/ Q1 ?! _5 T0 b% Z2 _8 _7 Y* D& ]6 P
        }5 v9 N" h8 [3 g2 `1 M
}0 T3 g3 y4 g3 A/ @5 P8 S0 L- D3 `

0 A) w2 {: _1 {3 }4 m; e$ J- ~8 V  C' k7 R8 T! g! g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- e2 [: F8 b- {9 T& E* U* p使用下面代码,对内存使用了mmap函数后:
+ w# E8 N# `. S- T/ I#include <stdio.h>9 r. ^* [* ^* {  G
#include <unistd.h>
- Y6 }) U& N- Z- J1 I/ w- z#include <sys/mman.h>
2 W' ^. \* s! J' Z- i#include <sys/types.h>8 F1 z/ _$ c' D# P# X! g" K
#include <fcntl.h>5 U% O  a- j2 A9 J+ z" }& ~
4 G/ o2 P- X5 A* ?" @
#define SHAER_RAM_BASE_ADDR    (0x80000000)
) j2 T! y6 p6 i/ R1 \5 s#define SHAER_RAM_SIZE         (0x20000)   
, ], t  C- q& p, d1 G2 P8 t5 g! F: V. K* \9 m
typedef struct; b. u& Q0 O' [- l, w+ Y/ |' {% u
{
7 j: a$ O+ Z- e        unsigned int a;# u0 U2 ?% Y  h- Y. E
        unsigned int b;
3 P5 M, z9 w8 A/ s; B        unsigned int packet_cout;1 q! K( P  m# x! R1 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: @, E8 c9 D4 M: H& G1 ^7 d6 L$ _
void read_MSG_buffer(int *baseaddr);
' `  U, H, q8 ^* nunsigned int count_copy = 0;# l+ f+ o( X$ f+ K" z6 m

' Q- V1 L7 d' @; _int main()
5 [) L! G: k2 n) f{7 D/ n9 y2 O; [3 |& V' e6 U
        int fd;7 |+ c! f8 l/ i* i7 L
        int *mem = NULL;
: n7 D5 ], Y) d, F8 o3 w
. O' e8 k, q1 Z        if((fd = open("/dev/mem", O_RDWR)) <0)- L. S$ P$ V* r: d
        {
1 C. }0 h& D5 U                perror("open error");
" p& y4 l& ]5 t3 i0 h7 T$ p                return -1;
: g  [; _. W; G2 W0 O        }% W" y$ E) O' ^; d
        ! s0 W* h6 Z$ A3 o; V! f7 S2 k$ G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 r; b1 O; n# t) }9 M

" J1 I! I' v& u- z" w' p        while(1)" V% Q1 C# d  `2 @- @+ \0 K0 L
        {1 D) K3 h7 |, B: E$ s! K5 E( |
                read_MSG_buffer(mem);$ K/ h# `: d# d) B& `2 o8 u% q
        }               
! Y( S( J) O: v* m3 j}
! E0 z% a5 o0 z! }7 e2 H) R( }. w& c, J: ?4 }" e* A
void read_MSG_buffer(int *baseaddr)
& o. C  Z# x- L, n$ a{
: a; e: C/ ~* u9 G6 \. q  C        pRX_MSG_PROTOCOL pshreRAM = NULL;
. u) ~+ R0 N: ~2 C; j' Z. L9 M3 U* @; |5 b1 z
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 V  x/ @0 ?' J. i1 ^% I2 l( u  g. K% Z% H8 L* l( P
        if(pshreRAM->packet_cout != count_copy)
4 w2 W4 F* s# y9 P6 a. E        {: |" h# B0 q  c1 Y" f9 N
                printf("a is %d\n", pshreRAM->a);4 A" ~1 u0 h  V- {# p
                printf("b is %d\n", pshreRAM->b);
2 [( L+ ]! X( p7 g0 ]9 f                printf("count is %d\n", pshreRAM->packet_cout);4 B! P8 x& a/ m) p9 L7 ^1 q/ {. }
                count_copy = pshreRAM->packet_cout;
/ ~' }5 [) h" B$ X8 H: Z6 B        }
9 d0 j( s5 r+ n1 ~( t5 A1 Q: b6 D        else( t9 n; b+ Q& {, d. e4 |
        {0 y1 X/ D1 W, z5 N: N
                printf("No effective message!\n");
# r6 D5 w/ r( u        }
6 m  C1 j+ s; e6 u}4 |$ U! o7 E- `: t
1 R9 M6 F7 p4 `& M2 t+ M# P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ p: F7 H# h; W" r6 o
% U: F3 \& {1 j' G6 ]3 g, ~: j8 _! S: N: X7 O8 M2 C

4 N+ H. _/ k1 |
3 H! H6 x/ x- O5 V# T. V6 ^- S' T




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