|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + c5 c! ?- x! g" I# C
" t0 Q" h- f. Z3 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- d5 Q# e1 I! r: Y, Z#include <unistd.h>
) W+ F4 O, ]* s# a$ o$ ~#include <sys/mman.h>9 f2 L. R D: K# e$ a5 B
#include <sys/types.h>
9 {! W6 W6 K5 [' U#include <fcntl.h>
: I8 L# {0 }% T" m4 v; M( X, z5 s3 A4 G/ x
#define SHAER_RAM_BASE_ADDR (0x80000000) ) q7 \5 J2 ]! I; I9 i# }7 d) n
% Y+ J. V7 `' }; W9 u: C
typedef struct/ d! l1 @% y: F4 S) b# Y6 ?
{. S) r8 B+ v( A D- _- _; k
unsigned int a;
' M' e0 j5 w* R2 v unsigned int b;
$ `' Y! D6 f; Z/ \0 P, f0 d2 ~: D5 i unsigned int packet_cout;
$ ^) N$ F! k" v% N4 y) F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! K8 G5 c* ]( b5 O
! c6 X5 k, ?1 I) A5 X8 wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 \- H7 G8 {8 F# eunsigned int count_copy = 0;5 L, S& h2 a" l) l
9 Z3 b0 @( G9 Z2 L" X, T1 S
& W5 H' l8 g& e
int main()* m$ R9 K: k4 D; o8 R) }8 l
{
4 W# n' V5 \- t) G0 U pRX_MSG_PROTOCOL pshreRAM = NULL;6 K+ c' Q8 G/ m
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 g! n8 P! Z) s) e
$ b, k9 l1 {2 R0 ^ while(1)
1 ~6 s' k/ E. a4 i+ G+ {. a4 c {
( @+ a6 L) _0 H9 G- y read_MSG_buffer(pshreRAM);
) V, d) d6 _3 J }
( c+ ]! l2 S2 `0 o}
! i+ b" t1 r: w' s3 x7 B0 c
* w [' H9 g5 t4 e0 X2 vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 H) u9 a) J# J& c{5 U, k F6 L4 I. N( i4 V$ _
RX_MSG_PROTOCOL buf;( n& p2 c! Q4 P) e5 E2 Q* m8 V9 |
% U: P* t: ?- {) |( L
buf.a = pshreRAM->a;
) \, C. P0 ?$ v+ Z: |% q buf.b = pshreRAM->b;/ u. |6 C6 c* @( z- Y+ G& [, @
buf.packet_cout = pshreRAM->packet_cout;4 E$ |- _# Z5 K3 X2 M, u, u
+ N+ z9 t7 | b if(buf.packet_cout != count_copy)& |) p+ F( G* f7 L$ g1 g0 s- U
{
2 S7 {$ V3 p( k printf("a is %d\n", buf.a);4 Z( m' v5 A# c. \
printf("b is %d\n", buf.b);
$ l) W' o0 G1 B# H: A3 p0 N printf("count is %d\n", buf.packet_cout);
, g0 r2 G& G- l% W count_copy = buf.packet_cout;
% Z0 m* {0 ]1 f1 i; e. X' P c }
8 D3 k& u: ~2 ^/ K: d& j else
" n' B, ^# O; f4 H" Y {! L# y# O( u6 Q( H) f
printf("No effective message!");
5 W( t) K i: C5 T }
; U8 s4 E9 D" x" {& P% W$ q* \7 n7 @}8 s/ t% X c. z
; l$ j4 k; A9 ]) r3 x9 N) T
: J9 x6 P/ B/ O4 R+ `& G7 V& @' H4 q+ \* o但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 c/ f. t8 k# j! z" n+ n/ U6 l
使用下面代码,对内存使用了mmap函数后:
) H; c$ \! Z9 {7 E# e0 i#include <stdio.h>3 p, n! K( U0 ]" A2 v. E
#include <unistd.h>% I7 }1 h8 u% e; j5 i, {
#include <sys/mman.h>& S5 R8 P3 f( a
#include <sys/types.h>
+ E- k- p4 J5 d( e" F) ?2 Z#include <fcntl.h>
6 d% h7 f0 U% ^! n& j+ B4 B5 |
* A% G4 |' A# Q( f8 d: n9 i2 h#define SHAER_RAM_BASE_ADDR (0x80000000)
) n2 @- e( D; L8 j: J& V2 C& X#define SHAER_RAM_SIZE (0x20000)
- h6 l, l# j7 |3 ~1 A: @! ]( S! I) l7 h; `
typedef struct* R% H% h" u- j
{# n: U( w6 ^% P4 O, s& S
unsigned int a;
1 r5 ?) w; {4 r7 S" T4 j0 G( X unsigned int b;
' }& S9 Z$ {' Q: I! f unsigned int packet_cout;
( f4 C4 h! Q) `5 X, q% ^# U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' E3 y3 G7 k) L) \3 p$ X& ^
: _; g( M3 W" D# `" `6 \5 ?void read_MSG_buffer(int *baseaddr);
0 v! d% H+ i2 t) T/ a# w9 }- vunsigned int count_copy = 0;
5 x1 K2 d9 y' v4 d" @9 P& _/ B7 m P1 [$ O2 n# t: \0 T5 P. b3 F
int main()$ C: p1 q3 ~0 N1 q- w$ d8 C
{1 y% t0 ]9 @% h7 k
int fd;$ x1 b) J7 @8 q6 [8 C: N
int *mem = NULL; O+ ^: T h3 A, w8 k9 G) N+ o+ c
. {4 f- T" S2 c I( t+ [8 m if((fd = open("/dev/mem", O_RDWR)) <0)
( }4 g7 K8 n$ z" H- H' h {
6 ^7 B W4 }2 }3 X: G9 E perror("open error");
" J5 B0 i5 E* q2 c return -1;
/ z2 j0 m1 e. S }
/ T. u& b2 N4 @' b* f # b0 i: H2 r( g
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) F* C; d$ S7 b5 m; ]( ?* M
( x$ N5 c9 }* v$ F9 A5 J; B
while(1)+ M; m; Z8 e2 W
{
- w' b1 ] n( \3 M8 T! g& P& u; B read_MSG_buffer(mem);
1 X3 @% E9 u, F" Z- p7 {( } }
3 U. D4 Z6 G; P5 K. x% P}6 k' v* B6 ]+ K1 g* v' E
" o0 `" c. Q' }3 E) x
void read_MSG_buffer(int *baseaddr)
, W, x' ~3 r. J. `; A* @% \1 u R+ d{
' A1 \/ v7 j1 g/ z pRX_MSG_PROTOCOL pshreRAM = NULL;
& b) n& E0 r) Z1 L8 w7 b, y
2 _+ i1 A5 g% S8 c pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 K8 A" x4 m5 O, f) f( `/ c8 w+ L8 A/ q' c
if(pshreRAM->packet_cout != count_copy)
* ^! D& p4 r% K {+ z' ?" C0 ]3 p
printf("a is %d\n", pshreRAM->a);
) O4 P5 z7 \* K! e4 ?- ~7 l printf("b is %d\n", pshreRAM->b);( E9 c2 N9 _) x
printf("count is %d\n", pshreRAM->packet_cout);
% F" P0 [7 u7 r0 F count_copy = pshreRAM->packet_cout;
6 b. ~: h. {# ? }" k! x3 `( ]* l2 M6 x! t2 H
else
' \! _3 D) S5 ^$ \7 S' Y& L- B {8 K E! h' T1 H+ T6 y6 z( f
printf("No effective message!\n");4 B" Y4 b7 f% W( Y
}
/ V7 L- o# j8 G y+ U$ t4 i}
$ Q" M U9 }. M. Y: u1 |1 `8 d5 n/ B f/ B" A! [( \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, m& u8 S/ t, N2 Q
8 Y2 V9 p, |, w- w$ Z# v5 j
0 h3 u, V0 h* y% Y8 a
# N( R2 q2 O4 w0 p% |
9 A% S. y+ {( X0 K5 x9 K |
|