|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # v0 L+ |& I$ i* w( K0 s" w3 ?
9 K$ N/ V) R" | i! b* sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 D( z2 ]: }! M) ?) r
#include <unistd.h>
7 @: M* j3 N1 {#include <sys/mman.h>+ y! u: v/ Z4 g3 B! X5 g* O
#include <sys/types.h>
; j8 v K" M) o; _8 f#include <fcntl.h>
0 w) ]& o% {! l. V/ ]
/ V# I% Y( A) k. o6 p#define SHAER_RAM_BASE_ADDR (0x80000000) ; v0 p) O& l: `# z5 Z
/ k8 \- U( G. d" Otypedef struct
& S, E6 ^ ~4 ^4 L0 }{
; K! q" W5 n5 }7 q; O unsigned int a;
% |% ?( q% K7 X unsigned int b;
4 ?1 R$ Q+ S3 [- h, n; _ unsigned int packet_cout;
4 N1 ]) d9 x& {8 a: _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ G9 Z8 H& t! U" n. R" X
; R' W" _+ X, y5 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" s. d0 z9 W7 ~' ^# c2 r- ~. a$ R0 _
unsigned int count_copy = 0;% I; M# x4 w6 |) H+ m
; P3 Z7 V2 K7 K+ ] S' `- ]
; `1 g7 |; |5 K) W. b3 z% Hint main()
0 K8 }0 i4 d9 g" i0 `/ ~9 u5 S& K{# B. M% d u. d. I( [4 \8 N6 Z+ \
pRX_MSG_PROTOCOL pshreRAM = NULL;6 w$ z! x" u! \0 d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 V- w9 e$ ~! J, M2 ]4 f G2 w+ \( R0 o: `: k
while(1)+ Q- g' }. b' P' ~$ b$ R: l
{
& {0 g9 E' K w0 n# X: s; _8 l read_MSG_buffer(pshreRAM);5 _1 _2 x8 |0 }* r+ Z
}
- H3 V& N2 g6 ?+ l7 T+ v}( \- L/ Y. K, ]8 U
; O2 |( O" [( pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) X" W$ r! t E6 |% X4 h7 p
{
$ P, y% ^6 D* ^# a RX_MSG_PROTOCOL buf;
3 ? p- H& [/ u9 o- a0 b
) Q1 t- b) ~6 L' ^8 s buf.a = pshreRAM->a;
5 V' I6 d9 l$ w! L9 D5 p buf.b = pshreRAM->b;
8 H# A/ T# g% _0 A W% i* M3 d buf.packet_cout = pshreRAM->packet_cout;
) H0 `5 S: p% K. e( X" }
3 s {$ m$ R# O1 g/ G if(buf.packet_cout != count_copy)
5 m% z0 Y/ I! q) |' h& J& a {
/ R4 g& r) c& Y/ O printf("a is %d\n", buf.a);
) v- y$ l1 o' T7 d5 [# {( r3 X printf("b is %d\n", buf.b);
; j4 T [0 t0 C! z: h7 L printf("count is %d\n", buf.packet_cout);
4 Z; s1 u4 k3 o- s count_copy = buf.packet_cout;
2 t P" _, Y3 ?$ Q4 {# j) a( Y }! h0 \. C6 {" Z: V2 f, M L5 y* i
else2 p; x' h" W1 W$ H
{
- i5 {% E& h) A3 P; L printf("No effective message!");
2 l; h! |% _! d% C }4 b# q- a, L" P7 I9 L
}
2 |9 X" @5 g! ~5 ?' ]3 d! e/ [4 W$ H# v! u( Z6 y
: b' I, `" [3 A l$ ~6 |8 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' l$ E R+ u6 p2 h5 n使用下面代码,对内存使用了mmap函数后:
# j( ?* ? [% ?#include <stdio.h>' M: b0 ^3 ]/ X+ d% n
#include <unistd.h>$ \7 `8 g" p' F9 C( P6 v' g
#include <sys/mman.h>
) w J& I6 v. }2 f! ^8 V- E#include <sys/types.h>3 o: o& g" K2 q! J. R, A
#include <fcntl.h>
5 h$ ~0 l8 N' |8 K$ T/ ? \# a
# p) v, K* d; i: X( M# r#define SHAER_RAM_BASE_ADDR (0x80000000)
6 e$ Z- c# L3 b# b/ Q#define SHAER_RAM_SIZE (0x20000)
6 K% H0 L) @! `, O/ B8 l ?& I& Y# O) E( Y% `
typedef struct
& A3 J* z7 c3 }: w9 y& x{ X' z& K; @4 y) Z5 V7 \6 R
unsigned int a;
4 j; d7 j" R1 C+ V. b1 f unsigned int b;. L7 e' }# l N5 m
unsigned int packet_cout;3 x' _' @: M8 |0 F+ y$ O' Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# p) g" e) w: I+ [" }7 x( `# ]
: y3 z9 m) y. G& y3 \8 L1 v
void read_MSG_buffer(int *baseaddr);
. c1 \4 Z) ]7 S& Munsigned int count_copy = 0;
]8 l2 }8 a7 X9 G8 m' _7 e, V! \. Q9 \1 r$ L
int main()% ?* D1 p' O3 h
{
& r& d/ \, Q: Q int fd;+ t" [ b- Y& n& @
int *mem = NULL;
9 Q& J( B1 \3 |0 a
/ Y/ E! f- L# v+ L if((fd = open("/dev/mem", O_RDWR)) <0)
5 N" V% w+ `2 W5 h! h. e6 n3 }# N, a {
$ F- C; K7 N0 y% c, r5 U! ~$ B$ y% p perror("open error");
2 x8 @- R/ ? p* R7 F: v return -1;0 R" z u5 r! ?; R: {4 W! \1 b
}" A2 }* s, @- a( ?4 o
$ U; `, [* M" M* j( h9 U, m( D/ D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 a( t1 ?8 a9 G) G p4 G0 p* J# f! v, u! e @2 I6 |1 E
while(1)2 T9 w R" j/ Q- x
{& @: c7 w% s& f+ y
read_MSG_buffer(mem);2 K! E1 i% k/ |& q9 R d
}
6 @5 a$ b P- c3 {) o7 u}
9 D! X$ u5 m2 I% ` B6 _' w
\1 u( p3 C! f* J) Wvoid read_MSG_buffer(int *baseaddr)
# q7 {0 V" g4 ^2 @! l* R4 s{5 U: D% N L2 h! ^' a3 p {
pRX_MSG_PROTOCOL pshreRAM = NULL;
: n* Z7 b3 O8 m. A7 |, A9 a4 e. B+ W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ r0 L& B4 A% y1 H! R1 d
3 ~0 P- g, l n. ^# {
if(pshreRAM->packet_cout != count_copy)
9 k8 p# H# C0 F( { {! Q& o9 {7 F* {5 Q3 c& g9 O
printf("a is %d\n", pshreRAM->a);$ Y7 U9 p, C0 V- s5 O1 [
printf("b is %d\n", pshreRAM->b);
3 j. y1 @+ I0 ~5 X printf("count is %d\n", pshreRAM->packet_cout);9 f# ^) O3 m9 M5 G6 t, m7 @0 @
count_copy = pshreRAM->packet_cout;
0 H, l6 V& Z: U5 R* r* j! f/ f }0 n. t7 L/ X+ ?3 }6 |8 _
else
7 P8 o9 w: Z* J) t {
5 K8 F# u t* W printf("No effective message!\n");2 `: h: Q% y, l: D0 b; |- n! j% S/ T8 w
}
% {4 }8 }8 M# `6 q4 S) r M}5 m! E$ w! G9 M/ y E' Y% i0 Q0 A: l" q
- E4 T `/ ^0 m* c9 s$ a# ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- i( W$ H$ _" C( u2 D* H
. Y% t9 P5 F( d$ K% ?8 c6 d* f ~: [1 L' A) n
& w9 p/ h5 \3 `3 u$ p+ `/ m0 L% Y$ L$ b
+ V' f7 q. H9 } o. w |
|