|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; e- w0 `1 v- O3 P
* F1 X4 o4 I, v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 d( _9 u3 K) e1 u* l5 V
#include <unistd.h>) ^) [, z8 e) k! o. T
#include <sys/mman.h>* M* {- B/ ^. J7 v7 D b4 m
#include <sys/types.h>
" P: V3 K& p' u$ W#include <fcntl.h>% \ L1 @* e& k2 ?
! t! h2 E3 j/ R/ G# E
#define SHAER_RAM_BASE_ADDR (0x80000000) 4 n, f# B1 A3 t9 O
) l9 d. x9 F+ g4 ^: E
typedef struct
; v$ ^) E+ y' [) w/ T{
' G' t5 z& g7 i% `' a& j0 d unsigned int a;
0 _) Y A/ g4 f! Y+ i# w) Z) I- e unsigned int b;* W* O0 ]# H, _/ u
unsigned int packet_cout;
" p! M) |* z; `+ u3 b! B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) l" S4 _% @1 r* h5 _+ _$ q. w% e: o ~4 I9 g) }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 y5 ~& `( |0 J# O; g
unsigned int count_copy = 0;* H7 w) X/ g3 E" ^
# o s( V0 F$ F- [
) v2 _1 L! Z) N6 S! ~$ C
int main(); I" N' c& C- G6 ] z! O8 B% Z. S
{! Z/ w/ K) f i
pRX_MSG_PROTOCOL pshreRAM = NULL;
: Q0 k6 [7 q3 s' ?/ C5 t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, m8 O! F" F% w$ q+ w
2 x' `9 f5 _9 q" ~ o) P while(1)# k4 ]2 }* {3 k4 }' J0 |! F4 U
{$ _7 D0 F( P( u& j) u3 [6 K
read_MSG_buffer(pshreRAM);' q/ ^4 p8 U0 Y: s, o
}
/ F0 M" D( V, }. M3 ~}2 d" {" ~) P+ @' P( M) S2 S
; {1 M. V' ?' z0 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 ~" R% y. j q% |{8 G( a8 P) R {/ J0 y( ~9 R
RX_MSG_PROTOCOL buf;9 s" Y; z4 Q2 o7 S! i; |/ {3 ]
2 `, f E. [1 Y( g6 ^8 _) t: e, A
buf.a = pshreRAM->a;- e! v5 A, t3 ^; I7 Q' M
buf.b = pshreRAM->b;2 V: D8 a/ _4 K4 f, n
buf.packet_cout = pshreRAM->packet_cout;
0 j0 |- Y% t1 R# _* {+ v5 O. c/ d$ c
" d. [: e1 P2 h) L2 Q6 Z v2 r if(buf.packet_cout != count_copy)# Z, O# |. {5 e& C5 h
{* h& \: W; r" |
printf("a is %d\n", buf.a);
+ t7 [) ~7 x2 L printf("b is %d\n", buf.b);/ s; M) }( j' R8 O0 C0 F& X9 |# i. r& @
printf("count is %d\n", buf.packet_cout);' |. W# |: I2 }9 V) U
count_copy = buf.packet_cout;
6 S9 L8 ?$ B) C' w$ | }
, t3 {; m/ C9 w R( \' X- y% x8 m else
4 b4 D* ?* B" G7 |# [* Z( a { H: X5 g9 ~& f [4 E! W
printf("No effective message!");4 ^3 C2 {1 q& L, x
}
. B* @" p$ i. U7 Y}/ B" U, h0 ?' d; d. e" h" k# H2 O% ?6 X
j' ?. Q# Q% z: I8 [
# t! i/ Z& a Y J5 x1 y) q7 J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" n P+ M6 z2 d$ }3 D& S
使用下面代码,对内存使用了mmap函数后:
0 `. `3 e! K) U8 I9 p: i7 x' T#include <stdio.h>
, `9 S: o$ e$ t8 g* E; C- w#include <unistd.h>
/ `0 A' q( n: W( K* I4 u& m#include <sys/mman.h>
# e) @9 f8 T. A2 @( B E#include <sys/types.h>
) t% D7 u: E7 D6 ^6 |0 U#include <fcntl.h>
5 m; g+ k) r6 X: [# n! Z2 B
) h1 p5 a9 k# d; C& a7 t1 O, u#define SHAER_RAM_BASE_ADDR (0x80000000), C% @. E, D9 i2 W- o8 O0 |
#define SHAER_RAM_SIZE (0x20000) 9 Y! U2 @% d9 p! p) f5 L, G
, _+ t+ _ S; n, s; m+ B
typedef struct4 E& C# P; b4 B. S( A: [
{
6 Z" c* M9 I+ ^6 S9 f unsigned int a;
D# a" g2 e& d/ m f unsigned int b;
/ j i5 Y7 L# z unsigned int packet_cout;
8 O2 P4 O4 d0 e- [" r7 x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 r( L: E/ P0 C% m0 m- ~) y$ p1 [: r/ K# M8 X
void read_MSG_buffer(int *baseaddr);
* V$ c6 S% q3 u5 g' _3 |: t7 @unsigned int count_copy = 0;
- t3 d* a9 ]/ e' d* W- L) Z" N7 Z: S1 l4 i
int main()
) s. w8 }1 l% d6 Y( r. F1 @{+ q% p6 G/ |( a, j3 v4 ^
int fd;
4 ^. R1 q1 D- c' ~! l int *mem = NULL;
6 B* x9 Q0 w( h" T9 S! ` b# p' K6 X, y1 V6 `
if((fd = open("/dev/mem", O_RDWR)) <0), ^# `: [+ |- U' A* L( m
{' `# B" e9 G" Y7 v/ ^4 \
perror("open error");
9 F5 p2 Q) ] P' o3 m return -1;. w0 C# s# P2 L6 Y( T$ p
}- K% n. V' I" |. @1 g
3 N1 h; K4 C7 K( U# r# S3 d mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 i0 a7 [3 ]" V: P7 l" j$ I' U+ G
/ G& g' w. S+ A3 S. `8 a6 h/ B/ S while(1)
, S* o/ T2 E' s6 y) F' K {5 l; r5 d" w! i# ]/ c
read_MSG_buffer(mem);# g3 T' o B7 e3 y
}
- q; g' y' I5 X0 }8 U9 z}
' L: O2 v; ?$ U2 c% y; I
' v; w9 d% l* I. v9 Z' P( kvoid read_MSG_buffer(int *baseaddr)% ]' K9 F7 c Z/ [7 |3 j
{
6 [ C+ t$ t) |$ j( N0 l pRX_MSG_PROTOCOL pshreRAM = NULL;4 @! v& U, m- L4 x! ~9 v" I6 b
7 a/ l- N) Z2 k4 R$ ^" P( Z$ d pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( S( F( x! ^1 G- m8 {# R
2 K0 _2 m& _, a! E. u1 d0 H: ~ if(pshreRAM->packet_cout != count_copy)0 Q3 _) Q2 g2 c( g7 q
{2 b: m c$ r; C$ \* i
printf("a is %d\n", pshreRAM->a);
( E. \& e. e" `6 _+ y- B% P printf("b is %d\n", pshreRAM->b);
/ N- Z4 y; d9 W& ^; x6 y printf("count is %d\n", pshreRAM->packet_cout);' A7 J- S \& w
count_copy = pshreRAM->packet_cout;5 ]" v+ X; p9 ]( G4 T( q4 c H3 ^
}
. \" T1 V: _8 V M6 b/ ^ else
( O- _; S; k% @4 l4 D {8 I" m. Y- E, X+ Z
printf("No effective message!\n");7 x* f: ]5 e4 h" b
}+ D: s, _$ }* o( z& ]- z
}
6 V# @: S( A+ w. J4 [2 d# b" [7 o# i& g7 C; v9 _, ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: A U) X- ?, X) A8 d$ G8 J. h6 `, ~( P' B8 U* U7 j, ]
9 M3 U* L8 y4 P/ ]; C$ Z
) @ T. a1 Y2 X/ q: Z
4 \& M+ _8 X* [% Z& Q |
|