|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% b2 s3 g U: ~' s- P5 U7 m
0 D c' W1 q- x" T; qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( g) z$ J: T+ n) w. E
#include <unistd.h>- `& I2 t( ~" y1 E* ]7 F! C
#include <sys/mman.h>
% q$ a$ j' a3 f& l7 J& D#include <sys/types.h>; q' h- Y) B. [2 d" [
#include <fcntl.h>- @4 s9 C& a7 v
5 V5 R3 F' B n5 `+ O7 {
#define SHAER_RAM_BASE_ADDR (0x80000000) $ _! k; E! m1 \6 Z% c& b0 j) u5 D, K
% v; y! N, h& c" r5 {! k
typedef struct
* U+ I" |8 S- s' \, `, a. ^# r0 x{+ E, E' a/ { P% Z
unsigned int a;
4 D! W* d# o7 R. O3 @ unsigned int b;/ e4 n: h; c. |5 G
unsigned int packet_cout;
( Z) y' [ W3 d- O* o; d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' j5 k. D) d, o9 X
) T5 E/ j% P1 I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 K& ?0 j2 f# { P) G
unsigned int count_copy = 0;
6 p; s( i4 u$ Z+ B, Z- s* u8 T( W
- \- L8 ]2 f5 B8 ?5 f) Z7 b2 h; _7 ]$ p4 Y0 s( O
int main()
- w. [: p0 L8 @- W; S' Q. L{
& Q! b$ u( B7 U, K, \* Y pRX_MSG_PROTOCOL pshreRAM = NULL;+ ^# ~) d2 g& z! w! A8 E# E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; k- E4 y: u7 J: b
$ n2 U: Z! f3 a7 c/ @1 j while(1)
2 ^$ ^( b8 ? K: L6 d+ {- X2 | {
! S( {3 }, L6 d* o read_MSG_buffer(pshreRAM);
4 F! r b2 S+ z# q1 u }
( F" ^0 p1 A0 o}
) _5 ^1 Z/ [2 k4 n/ r+ h3 e5 S: z# Y4 T1 E4 W; g& d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' H" ~9 n, z3 ?* s: X) }$ A
{
! `- \, k& c7 |$ m6 c RX_MSG_PROTOCOL buf;
) F- Z2 d4 `! k) A0 V
; A5 U9 w) B- W3 B* Z) `) q- v buf.a = pshreRAM->a;% T8 _) B5 O6 D1 E# p
buf.b = pshreRAM->b;! D4 k7 W0 R, q1 `6 h5 n
buf.packet_cout = pshreRAM->packet_cout;* ?0 O* S; s) X1 _' q4 e2 d1 ~# Z
+ x5 p0 |' G/ [3 t! C if(buf.packet_cout != count_copy)
( @ n4 b1 |% |9 [; |- B {
( Y- R' l4 [! S; Y/ T printf("a is %d\n", buf.a);
% t W# S9 P8 F: w+ l: B2 c7 I printf("b is %d\n", buf.b);
2 `+ g$ P# @6 q% L printf("count is %d\n", buf.packet_cout);+ w& v# ~8 o5 m$ @+ o1 u( [
count_copy = buf.packet_cout;
) c- ]; a. q$ B }9 a9 `/ d- }3 X- s( Y) h: E% w$ E
else; z `5 @4 j. P0 L/ R K
{
( D5 W5 s3 I( E A; M6 E/ ~ printf("No effective message!");) A8 r$ Q* h3 w* J. n
}2 | e: y4 J i
}
: U& ?- b ~( j3 e" x- d$ D) m8 P% t' Y0 Y2 t7 V" J" {
q# x2 w* y# F! j* w9 k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 f& w4 ~% s+ O6 i$ H7 ~使用下面代码,对内存使用了mmap函数后:1 v* V; ?% Z4 n% V0 q7 d V
#include <stdio.h>! c; ` X1 T5 y2 O& [, m2 n
#include <unistd.h>7 \. V: x8 M, n) Q& p
#include <sys/mman.h>
1 @5 b7 y! a. z! x. B7 O#include <sys/types.h>
7 J0 e6 x/ \; d0 P* @& Q#include <fcntl.h>
' u- R; w* q- q4 L% ?0 Y; T/ C! k. G; g1 k
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 X; z$ I$ o0 W$ ?#define SHAER_RAM_SIZE (0x20000) ! i" N- m3 Y H( U& ~& J A7 }
8 u5 O$ b- a" i0 l
typedef struct
. W$ j$ [+ Z- E5 j8 z{
4 y! C+ c7 Q! O A/ x unsigned int a;/ x3 I) L# }: b N7 y
unsigned int b;
1 ?7 H! C5 j* Q0 W* i- g" Z; j unsigned int packet_cout;
0 ]4 _' m( Z4 f8 u# s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' S0 K2 T6 G0 k) L2 E
7 z9 g1 s& T* b U7 z! k
void read_MSG_buffer(int *baseaddr);# H# J0 _0 R( {! w9 r h5 g
unsigned int count_copy = 0;
! z3 x7 F" \) Z& ^) ?( |5 j. `+ z8 a& r, @ [1 }
int main()' D, d1 K8 F$ D8 e4 C
{: u" [% Y" @( X6 r$ V/ T
int fd;, ~) _/ M' g9 E! r3 H1 }$ j
int *mem = NULL;
9 i5 v) R" Z& ?2 _/ c+ k ?+ I$ e v; Q& n- X' h. ^
if((fd = open("/dev/mem", O_RDWR)) <0)
3 W- D0 N$ [7 f- \* \0 g {
8 ?6 j$ y* X# f! R0 ^* Y perror("open error");/ N" ?( k" u, h' q6 O* ]4 A
return -1;
; M# S& J6 F; K }& b* \8 }$ t6 c: s' l+ L3 U
& R+ I: F) s+ y0 Z% t mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 i3 n3 X! ~& U
( u, {5 ~' R7 j while(1)
# y6 W* G; e5 @2 N {
?/ [- o7 [1 V! v9 G& p) N4 t4 m& Y read_MSG_buffer(mem);' E/ p& O* M+ T: J* ~
} . q" p% z# w! G X. G
}4 U% i8 M) i9 Q+ j& [
5 H( [$ E8 J5 _1 Z, k* [void read_MSG_buffer(int *baseaddr)
1 M8 U+ O9 z+ ]- x1 \/ L% H{
5 \/ i5 A; T1 w pRX_MSG_PROTOCOL pshreRAM = NULL;3 @% N: G- t* h' L; }
" W# s- x) V L, k+ C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ J8 h+ @' a1 W! [- `
8 r y# z4 T' Q$ x& Y if(pshreRAM->packet_cout != count_copy)& u8 t5 l# x! Z
{
1 L! D# z. ~, _- W printf("a is %d\n", pshreRAM->a);
8 T! B# J# R- ? printf("b is %d\n", pshreRAM->b);* M+ p: B* u( j% m
printf("count is %d\n", pshreRAM->packet_cout);
/ K) U- y) z( S1 |' n0 P1 b count_copy = pshreRAM->packet_cout;
% {3 f1 i/ b) `. ]3 v/ ^ }, q5 E. h' k' [& O2 u0 r2 B
else
- O5 O: I# `7 _! k5 t {
7 l: k$ V. @) `. `* ^2 G% |8 Y. L printf("No effective message!\n");
m3 K9 ]) X" | }
2 r+ R* F8 \3 n2 R2 r+ ^8 v9 J& ]}
- I) u! S k0 w y9 A
, a$ q3 H; [$ \! p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) g( f& g+ E$ n n D
3 C0 M% X- P. N E
( K$ }% N) u5 Y% W! H2 `0 U( M4 `/ H
$ C5 c0 \0 y# g! Z! K/ I3 [8 [! }
|
|