|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% E" M1 i$ [, s% B8 z. Y' }3 X, ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 D& c- t7 \& g, I: n! J6 P
#include <unistd.h>
6 A+ \; y1 v. G! w0 K#include <sys/mman.h>! L" \8 N7 l1 [, L0 E" n* l' j
#include <sys/types.h>0 G* `9 l$ ^5 [& T7 b9 |. g$ Z
#include <fcntl.h>
- [( N- a D) L- A) E j/ t+ h' v J( _1 r
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 l4 g2 N; i! e& | i; c7 _, H" V! C. D2 X5 Y* H
typedef struct S$ }5 _. Z7 x
{
8 Y, |$ v& A* c+ C0 s unsigned int a;
- ]7 l& J2 m' n4 f unsigned int b;# W8 I5 C( \1 J* v* o
unsigned int packet_cout;' M1 ?9 c2 ^6 [7 }5 K7 A. H d1 K" o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ]- N) U: x$ C; J% Z& Q3 I, }' g( q7 A* \+ f Y3 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 F8 T' p# S3 L9 s
unsigned int count_copy = 0;, Q+ e/ B& x- F0 n
1 _* {' v& g' k" O3 r5 @1 i3 Y8 L
( T2 Q/ ^( n' {* t1 Hint main()% E( p% h0 F# Y6 B* F
{
4 `# @. p$ u2 n pRX_MSG_PROTOCOL pshreRAM = NULL;* z/ r. X, {* @% ^& d$ T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' Y- |8 e7 w6 f, _ m% Q# [
. Z [% v% e' B$ ` t- c/ Y
while(1)- s% X, m& D2 o2 O# ^
{
, s$ |" O) E# l) j read_MSG_buffer(pshreRAM);7 O: p) \7 L% \4 J2 H' N! V7 s
}
1 N& h: Z1 G6 o}
3 P" U# a4 y: `8 h( n: e4 l' r
7 f# f1 z0 ?9 f/ |% X% G1 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( o8 q, z: _; i6 r$ Z
{2 R9 k. q+ L( _0 D) Q4 P
RX_MSG_PROTOCOL buf;
! s8 c0 X* k( n1 p8 j Z0 j
, N. c, O2 U5 Q& E7 Y buf.a = pshreRAM->a;
6 B. E z7 @- o% C! \ buf.b = pshreRAM->b;4 o# F6 I& |( Z9 t! u; d
buf.packet_cout = pshreRAM->packet_cout;# Z9 C, w* A! U* Z$ J0 L! n9 z6 P
3 a3 e0 {; N8 G; l if(buf.packet_cout != count_copy)
! P. n& O/ |# Y$ E% R8 C {
( a4 ]! }& z m# j printf("a is %d\n", buf.a);
. r5 _" r7 r& l% S& B& l printf("b is %d\n", buf.b);
# _; f% J3 R. j: O2 v; | printf("count is %d\n", buf.packet_cout);) t! Q& o; l2 n$ u9 K
count_copy = buf.packet_cout;
3 c6 o7 e3 Z: z. c+ W( } }3 a) u. \* ~6 c: D
else
C' {! J# S8 \: t. [1 @ {
2 u# k( r0 ]4 b; z( O0 e" q printf("No effective message!");
6 t9 \" D$ c! I/ n }& U1 ^: S6 Y3 H4 N& {7 `
}
$ w- l1 X* r* r$ b
! ~# s( P) B% G9 D6 F4 D3 X; _6 S/ A# Z$ _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! U; B; @3 d2 p% U+ k! X; F
使用下面代码,对内存使用了mmap函数后:
' }+ H" {" u2 L2 R+ m#include <stdio.h># H+ h+ A) @- X x* ]% G* E8 M s
#include <unistd.h>
- x3 R; I0 R, J* k9 M7 `1 X#include <sys/mman.h>
# B/ G7 d5 R5 v' \#include <sys/types.h>
! u* N, `8 V7 F6 u$ Z9 x% @#include <fcntl.h>
U: C9 R( A: I
8 |: T# r0 W0 Z; X#define SHAER_RAM_BASE_ADDR (0x80000000)/ k" A$ k0 M/ N L6 k
#define SHAER_RAM_SIZE (0x20000) . T: A8 G0 Y/ F" {6 i
/ w/ \$ y# J/ X) c1 n6 i2 \typedef struct
, u' r( {" _; O; Q% i5 j2 I2 _) ?{: }( I* B( `+ }# `; n7 w" \
unsigned int a;
?+ D) S' @9 ?$ v unsigned int b;, B: I4 o0 b7 q* K- O1 L ?, w
unsigned int packet_cout;3 t+ r* i/ L* o4 p& ]& v d _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 q/ T3 m. {& P5 }' d8 |9 @8 Q; o6 ]/ ]5 q: X6 L# _: U
void read_MSG_buffer(int *baseaddr);
4 r. |# Q! b% y x9 Dunsigned int count_copy = 0;# s& s4 C4 \ X; ^5 v
& F: W& q& t0 p! w8 m, `int main()
+ r H2 \" O7 K! {{
/ m. b8 u7 M' y4 ~ int fd;
& k6 x: u# v6 X% r3 k, c6 ? int *mem = NULL;
$ r+ g; V& P' y. N- r5 z4 n# {1 u# _8 r% e/ k/ h
if((fd = open("/dev/mem", O_RDWR)) <0)
- g3 A) ~- B# V3 { {* l- w$ E- C: c/ F
perror("open error");
* b3 N$ f! |( w return -1;* s+ Q% r5 O7 J" C3 d t
}$ {) P5 k/ e2 a4 l$ I% t
: [* ^$ @0 E+ @/ q' q# d mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. W Z5 M* l1 ~$ ^
) Q2 R3 e, v3 X& @% T. j while(1)2 k- s% i1 P8 V( ?: S9 M: Q3 e: H
{& `- {9 h) B' w y
read_MSG_buffer(mem);9 T6 m' ]; K1 s. v# l) V5 c
}
& ?$ l+ A1 e$ i, m! @( }+ u: D, `}
: }$ U2 m0 @2 G# o. v7 N5 a" a: l
void read_MSG_buffer(int *baseaddr), S8 ?- N& u; g6 S) ]- u
{$ O, H: z$ F; Z5 ^, \7 y3 H1 a# S
pRX_MSG_PROTOCOL pshreRAM = NULL;$ `4 K* t" @. t) M5 R4 o2 w, s
8 x0 P- u1 ^/ M2 ^9 V1 g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* I4 H: Q- v; o8 N1 G. J# o) ^( ]/ l+ d& o- N# D2 O5 M
if(pshreRAM->packet_cout != count_copy)0 }+ `- u% ^1 y4 \
{" n: ?7 }4 T H
printf("a is %d\n", pshreRAM->a);$ C j% f% `5 o
printf("b is %d\n", pshreRAM->b);
: l6 G& F Y( W3 B+ e& B printf("count is %d\n", pshreRAM->packet_cout);% N7 X+ Y9 O6 b7 Z, S5 W& P
count_copy = pshreRAM->packet_cout;5 W7 K4 E4 _0 ~' v/ X: [
}
V2 L) N `0 ]" R else @5 E2 E, A& K" e( _$ h$ V5 T. E
{
# L# ]* I, Z: @ printf("No effective message!\n");
" l9 |( Y( L" V' T) k0 Y }) q% V9 [3 P) I
}4 N" N& _, v# t
3 R1 B7 ?; T7 z) m( @) |2 z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 c- t9 [# [0 s! J- O$ ^* p' Q& B8 {9 [: X2 z
0 ], w5 [- u. C$ p2 c! ?
5 k) F( R P. e) `2 f. j0 v6 `( T F6 U: C S* r/ X& k
|
|