嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 P* U# O* I, V* @4 P5 V$ W: m1 Z  q% m" A+ @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
% ?+ ^. x- r$ x$ }/ H! ^  q6 e#include <unistd.h>. O+ n7 b% n/ X+ F9 \0 A
#include <sys/mman.h>$ a  v6 X7 L- h! j8 ~
#include <sys/types.h>) J9 s8 _" _. y; d
#include <fcntl.h>6 W! K0 S9 b4 n3 m! i" f1 ^

" C& G, A8 v7 T- a! Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   # t$ a5 ^5 Z& _  [: u

& }- T  _# Q5 d% U4 c8 R' Xtypedef struct& E# S4 U& ^, n7 \( K
{2 u. }  c( |: D
        unsigned int a;, I0 ^, v8 E/ H& Q
        unsigned int b;
- o6 J5 a) X% d) `" q$ g- E% i        unsigned int packet_cout;
5 e7 }' F' g  K3 a$ _# {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 H' N: N9 }( F* K$ I% S9 n
' [( ~; {# c( P# u  Y+ Gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ a% A' x1 |* {. l) ~6 Junsigned int count_copy = 0;0 X# K. U/ x9 b
7 K$ {; `  \: k4 H8 ^5 N

: V8 ?+ h( k$ m+ k, iint main()7 _* J* ?& K1 L3 a0 U
{' B3 [* c& @$ P1 M4 R0 u
        pRX_MSG_PROTOCOL pshreRAM = NULL;) G" y5 X) ^- u- o1 l: U4 L
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' v/ y! S. q' \

, }8 v7 B' [! [( L. ~1 N        while(1)( [% |( r5 i" k  x  I  B: ^
        {
4 U. u7 y2 F' M4 w3 o0 t                read_MSG_buffer(pshreRAM);
8 w. i/ p- W- J# O' h: R- l        }               
. p& y# ]% Q/ I0 T}
- P2 [% l+ ~+ C- w4 K+ {  v$ v% x7 `! u! J& {# c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ L+ ^. h- O) Q) w% i
{
8 O1 H, g8 z9 D# Q( O' U- e1 W) t$ k2 W        RX_MSG_PROTOCOL buf;' z% k# |( J; _$ H( ?' s4 `
        
; p  D$ h7 D8 N/ q; F* C# i        buf.a = pshreRAM->a;, m4 X2 T5 T; F
        buf.b = pshreRAM->b;" m( ^1 o( {! c" n# k; S* R  n' `
        buf.packet_cout = pshreRAM->packet_cout;$ @3 M7 }+ |# N/ X2 g
        " J5 |9 X6 {. X7 {( Y
        if(buf.packet_cout != count_copy)
$ B! X3 S; `# ]6 N5 r! z$ N; c        {
5 b1 U, c2 {2 R/ \8 g                printf("a is %d\n", buf.a);
* `! L9 E9 _7 y% u5 ?. j                printf("b is %d\n", buf.b);" ]& Q# R$ F5 ]& n% B% E1 _) f
                printf("count is %d\n", buf.packet_cout);- T# h6 B7 s& M( f5 t2 e4 W/ y
                count_copy = buf.packet_cout;
" B3 M% ]7 h3 V9 D        }
) o6 X+ k0 m0 V$ K+ m        else
& c. O/ z( L% P* m* R- A  m/ p        {9 G' ?5 x4 p; O! S
                printf("No effective message!");
' K$ E6 O( |5 g1 [9 [        }7 b' W( Z/ ?, I+ ^) M. C
}' \5 \& H6 j. C* O( R4 p' [

, e8 f8 |, S3 }# t+ s' x# t$ H" e: L2 R8 `0 @4 c/ a* H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 W! k! L7 ?  Q$ P! M) M
使用下面代码,对内存使用了mmap函数后:% }' S5 b& `! T/ T# l  V  \
#include <stdio.h>* T9 a6 A, x" V' r( j
#include <unistd.h>! W& d& i3 s- c6 y1 k, I
#include <sys/mman.h>" B2 g, P2 v7 X
#include <sys/types.h>
6 M7 ]' s" J& k- w- _; Y! N#include <fcntl.h>
! Z$ q  q' E$ Y: e# K- [. t' Z' ^  s. l- k5 e
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 D- Y. @" h2 z  k- E
#define SHAER_RAM_SIZE         (0x20000)   
' z5 J) b4 E+ t' `0 e8 {; b4 d& c+ K. i% h0 p& F
typedef struct
# h# d% U2 _7 g{
- s6 X6 Y6 Q3 X6 y, l% k1 ]        unsigned int a;  P+ \) |7 A$ Z1 |
        unsigned int b;
6 h. b1 z& L/ U4 i        unsigned int packet_cout;
! b9 G" h8 |3 ?. ]$ W8 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- f9 N  e# i( f, P2 H6 {  r

$ D6 K5 J  g% u& t4 E0 D4 C; M" W2 Tvoid read_MSG_buffer(int *baseaddr);; z) i, m8 j5 Z
unsigned int count_copy = 0;
2 x) N# D% u* C' w: q% u& ^/ F- d* L+ S) W% Y5 C; E
int main()
0 c: a" V* h: N5 d7 N{
. W! P4 [1 X* b4 M        int fd;
# ]4 k; u9 O0 S( }  j- v+ \9 v        int *mem = NULL;
4 G3 O( U  @; N2 e! B. l- p( ]5 A/ N2 M  T
        if((fd = open("/dev/mem", O_RDWR)) <0)6 Z' [! l8 C" U+ s
        {& F% L3 v' a9 z
                perror("open error");+ B/ S6 T, G$ Z9 \; j* F
                return -1;
4 T. h4 w* g' R/ O        }
& l' B% B2 A4 M) F0 x        1 q% ?( T; B, ]! I5 B5 |3 o" V4 j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 d) e8 V' e5 u" M! x  I

/ z- a9 V, x2 w; A. N0 X        while(1)9 D: W3 j* C8 Y+ J
        {) A3 ?3 M1 O1 L2 K
                read_MSG_buffer(mem);0 T: q+ Q! v' ~3 H
        }                ; n$ q: k6 N; R
}
/ F! ~/ U+ q% Q7 W- Q* d- O# w; w5 j  J6 r
void read_MSG_buffer(int *baseaddr)3 Z; x( c; a6 U/ U1 V0 _
{
: O# i7 @0 p2 J" Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 b9 s' d2 j5 V! j5 B% X2 [8 G4 J  d  y: W- e) f# k5 h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& I$ j0 m. T0 Q. y$ m  s3 s5 D+ ^
& P+ Z( e: C% C/ u% f
        if(pshreRAM->packet_cout != count_copy)( o" j* T$ `) ?1 f
        {3 X6 {: _9 G" P. T
                printf("a is %d\n", pshreRAM->a);+ K+ i9 u+ Q- K4 T8 h' H
                printf("b is %d\n", pshreRAM->b);
6 p7 U* ~& K; }% }                printf("count is %d\n", pshreRAM->packet_cout);. k0 ?; \0 c8 o  S5 D  p% `3 K
                count_copy = pshreRAM->packet_cout;
5 O1 _9 b7 x! \        }
; U. z+ E/ X+ `8 ~: m4 y! p        else, I8 O2 {/ J: `* \; N
        {- W8 ^1 _' C4 ~( h* i# a
                printf("No effective message!\n");
: j1 ^9 J% Z1 K$ i4 I1 G7 D( i        }
9 x; v# P* P" y- N  |6 e}' [' j) A( I$ \( q! b; ]6 S+ u
5 R% Y% D6 o  L% i$ }, x% G+ n2 f" }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! i' C5 K% o8 e5 ~* E- l6 w0 s/ P# J" ?
) h0 D1 z( J5 G% K4 G

8 C; s0 Q! H6 S6 [# }
! O/ }2 B/ E  `! u




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