标题: 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