|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 m ~/ S3 k- x V9 `2 R7 \
, K/ H0 e k- i4 u4 ~0 QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># ]- m& o ?2 z& P1 w9 V* i" B
#include <unistd.h>1 P1 s% B1 ^: b+ ?
#include <sys/mman.h>
2 W' w: y# V% A0 ]5 W0 Y. W#include <sys/types.h>. `8 D, |; G: }8 \3 R& |
#include <fcntl.h>
3 m% |: a4 a( Z/ j6 I
: ?8 A( { K5 ?6 S/ B#define SHAER_RAM_BASE_ADDR (0x80000000)
. s) R5 n7 p" V* W4 h0 Z* h7 t5 ?" L% N9 {
typedef struct
. f$ z j5 W5 k. D: a! Z5 h! W{
6 S" H' K. O6 r# [ unsigned int a;. w9 E& L8 `$ _
unsigned int b;
) x0 ^& d: |8 X3 U, t0 v unsigned int packet_cout;( _2 O# W+ i+ d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 {; p: p7 v# D0 ?0 J
7 m+ I5 A9 z' j8 Z& N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- a, p o* a* g! G3 \
unsigned int count_copy = 0;$ V, w7 K& _9 b1 r+ W% T
# A' I! z5 S# q2 K8 X* ^6 V7 e, k! D) A+ w
" ^9 d/ J7 w) ^& p3 D eint main()+ [1 W7 d" u- U. ^3 I& N ~" @" ?
{ B+ e0 ]2 g9 X2 V
pRX_MSG_PROTOCOL pshreRAM = NULL;
# d; [0 D( } M, S pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 u" f6 |1 j# \" H/ n3 h
7 x5 m$ ?% T0 {2 W while(1)+ k- U4 d! H3 s" a/ f
{
/ w) _2 O. { w; W1 Z" z read_MSG_buffer(pshreRAM);
# [8 c; ? f5 }) H3 j. i0 { } 1 S4 X/ |; a! Y8 L$ @! o
}
7 B: w! C5 ~& `+ @* i6 k7 z
. J0 e8 ]8 [' U- e5 @( Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). n" @' _: B6 l2 ~4 c6 h
{( W& q" I% A- L. q! D
RX_MSG_PROTOCOL buf;- o- a; @9 A7 r0 [# k
6 ^- B) Q. w6 W, {1 d9 o, d buf.a = pshreRAM->a;
; l# B I: h. u+ X buf.b = pshreRAM->b;$ |2 d( i1 {; o
buf.packet_cout = pshreRAM->packet_cout;( ~/ q2 u) y1 P( i$ f7 j
4 `" _8 u: X; A5 C! P if(buf.packet_cout != count_copy)
' l3 r, h9 C! H# _- h, { E) M' I {0 M- K- a' Q6 A- \
printf("a is %d\n", buf.a);% ^0 o) I+ o9 s0 `7 f
printf("b is %d\n", buf.b);
4 L2 \9 U9 g- X2 s0 q& P printf("count is %d\n", buf.packet_cout);
, k$ f( ? e9 P' E4 i3 v count_copy = buf.packet_cout;6 @+ W1 q' u: X/ ?
}
& G" @; s7 T! z" V9 Q1 D7 V else' O" q$ {; x7 `
{
- _8 G5 T! w, {; T printf("No effective message!");
) _" w" b1 y5 Q9 J- [ }7 g) D& ?3 m* g& @7 K
}
& i$ o, W5 \% H) E2 o5 N
~$ A) F7 u$ c8 p7 G1 Q
3 z% W1 c. n/ P1 }3 ^2 i但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! l1 p0 K8 t [8 t5 [5 w1 V; d6 T使用下面代码,对内存使用了mmap函数后:; B7 o7 P! f1 X, B& c* |! C$ u
#include <stdio.h>
% d2 V( f- Z, p [#include <unistd.h>! g) E: s4 g2 v: r9 `
#include <sys/mman.h>: A3 {. m- ~. Q/ f1 r
#include <sys/types.h>
6 c! a) L7 {' h5 U1 D$ g#include <fcntl.h>
& g5 x. I% `! b5 k) x) Z+ [
5 {% O8 D, h# N) Y' Y6 w/ j& K6 y#define SHAER_RAM_BASE_ADDR (0x80000000)
1 b3 ^9 ]- Y1 ?% A# C# I; _! L* V#define SHAER_RAM_SIZE (0x20000)
2 I5 }+ L. F- ]+ _$ L4 W) W2 H+ E. h0 S0 n7 y3 ^/ u
typedef struct
+ I) i5 o+ j5 G, ]/ Q{
5 a$ [; [) Q3 @8 `2 w7 X/ d2 ] unsigned int a;
; n4 E5 N0 z4 T- Q O unsigned int b;
* p4 i# l2 n' B8 s* Z unsigned int packet_cout;
* e/ @: Z) H. r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' \# I! P+ \3 \! d" ]' i$ e2 I0 \
W9 M" D- ~( l" H1 J" ?1 B! o8 tvoid read_MSG_buffer(int *baseaddr);
% r/ G( p. b2 wunsigned int count_copy = 0;
% E7 F7 R- x! t
+ ^- T6 n/ `! }$ R# _int main()" h" O5 c) Z" E4 a+ o! z* ?
{( r) M" w- G7 p/ v: R. a
int fd;: U$ X, e5 W% _( h( v+ S% z
int *mem = NULL;7 I8 V- X8 e: \" J5 s) y" h
2 a7 W$ y% F6 n if((fd = open("/dev/mem", O_RDWR)) <0)
& R R5 {( ` D' J {
" T5 G* K4 }3 i' y perror("open error");
; q8 ^ S6 }( g6 T4 c return -1;
7 Z( F2 y# W9 `, U% ~ }
) S* N$ j' f) ? & U/ C, _* D/ k* {& q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) ` ^( l) w7 Z# e: J& Z& l: h/ q* t
0 l: Z z$ ]# }1 p# ]5 c4 D while(1), b& Z# h+ W- Q4 r- j
{: e# K" ]* {! O! F
read_MSG_buffer(mem);
; x8 l/ k6 K2 g' J& A* [ }
. W* Z8 g& N( I) G2 r! {* N}
0 h: k+ C% I! R4 S+ h$ V2 {# G* @8 Q- V6 x8 W
void read_MSG_buffer(int *baseaddr)
; j* s) P8 y, T; P{
/ v- V) ` w5 B% G3 f, E- W5 H pRX_MSG_PROTOCOL pshreRAM = NULL;8 \6 w. M/ t% D$ o
/ X4 v6 r5 H( v, k pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 u# A m# b$ F$ @6 K9 v1 \. z; `! l7 h% ~, r& M; p
if(pshreRAM->packet_cout != count_copy)) M/ ~' T" X. V( W
{
9 F* `7 y2 |9 O8 B/ C; T& w4 R printf("a is %d\n", pshreRAM->a);
0 E2 r- h6 G: w) o printf("b is %d\n", pshreRAM->b);
0 H' c: Q8 v2 z' A' S7 a printf("count is %d\n", pshreRAM->packet_cout);4 t6 ?" b# K6 { @
count_copy = pshreRAM->packet_cout;4 R, z$ Z2 F$ Y! k" o/ M6 P
}
$ g" U, w9 M; s* D% o' Y else+ c7 E x2 A* K+ I7 t
{3 N5 [4 ]9 }. G) {# K* l- [5 A$ j
printf("No effective message!\n");
9 a6 I# ?5 Q( v" S ^+ M }6 h5 P1 E' S' ~) S) m. o, k9 h2 E
}8 q* H/ n# O. p1 G' r
5 u) `* T6 d" J0 I2 W1 N* t. r/ e$ ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; Y7 p9 d2 y7 D0 T+ X9 i( v ~
8 [! V0 e L y: r* \& M$ z8 K4 B! ` ^& J3 `
2 `9 j3 _2 b) W1 a
% y- X& t8 A6 C* x- U |
|