|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & j( e5 C/ H% g% F, E; O$ d
9 ~' d* q& {4 E ^+ F. x' p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( @: L3 j4 J( B' W% X
#include <unistd.h>
, S/ q, T; R3 C, s7 v. R#include <sys/mman.h>& b8 \9 }$ L9 W; `$ B$ ]$ d
#include <sys/types.h>7 L6 o1 R, K/ h; W
#include <fcntl.h>3 Q4 t6 b3 u' Z6 u; m( d- a+ P8 E6 l% I
( P: p& P4 j5 ?9 `$ \8 X#define SHAER_RAM_BASE_ADDR (0x80000000) 3 W* i u& l' ? ~1 Z
! E6 z" ?5 `5 I2 q# `typedef struct
$ r) r0 M$ x5 g H{1 S! h! H8 y8 {% C0 D O. H
unsigned int a;
' M( |+ y; P/ ^% a/ u/ w* d unsigned int b;
\2 e: p; r6 F1 i m! [6 S1 n9 ? unsigned int packet_cout;- u8 P5 D& q5 Y+ q( ^) R4 U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& Z2 }$ ^* c2 p' Q. N1 T; a
# s, S r) W0 G, d6 fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 S, f9 W1 k6 }6 e' Y9 @: z( i2 `
unsigned int count_copy = 0;
# I) ]" c. G! H4 u% P; u* Y( v
5 Q$ Q- |) ?6 U' j/ u$ h h+ ? D# {
int main()/ _2 V! g7 |& B
{
( {) r: i+ f) W1 e pRX_MSG_PROTOCOL pshreRAM = NULL;
% y- H# O) P/ h6 B* X pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ z6 R1 p% v0 t2 D# t8 ~; E- J5 M7 v3 y0 s7 W
while(1)3 L3 Z+ L4 M9 i) ]" Q
{
\0 p# a$ f4 L9 l& c6 a, j read_MSG_buffer(pshreRAM);! K1 G* C+ Y. @7 ?4 k+ ]7 }
}
; R/ [1 r" X5 c}
- ?- x6 ?' F) O4 f, U: M' o; I2 K% G1 C6 }$ w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" F% c9 N! b/ W8 X4 E
{' z: H# T0 |4 [
RX_MSG_PROTOCOL buf;: B+ p6 V5 Q, y5 w5 S) f5 E
, }0 J0 P ~! ]# _; B! r5 e/ e% Z
buf.a = pshreRAM->a;# _1 Q7 ]8 `" G% ]4 b
buf.b = pshreRAM->b;
- K% y1 m" K7 O: f buf.packet_cout = pshreRAM->packet_cout;0 W4 O% I, J, c( _8 y/ ~
9 @- H; z8 f) T9 {
if(buf.packet_cout != count_copy)) B* _$ u1 ?6 q
{
% ~ A9 [2 [% N- Q( F printf("a is %d\n", buf.a);
. Z8 Y' V, R& b" s printf("b is %d\n", buf.b);
8 o; N5 q7 A; {- N3 \; U0 t$ L printf("count is %d\n", buf.packet_cout);
& h" C- }% `% p. t. L4 E count_copy = buf.packet_cout;5 B6 P0 X/ P- k+ l
}6 a/ l1 c% Z0 u
else
5 S' o, {( g% r+ b/ ?! t {2 l* { T+ n. n; x
printf("No effective message!");4 d0 U, g/ L4 O4 L9 @. |! X6 _
}- v/ }, c+ {& h/ T. J+ e3 Q
}
% V. l W6 f6 R* }
, e/ s/ Y! |0 T0 D. c0 n# P# s4 z1 _& N- N: A' P& | ^
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 N, k6 i2 ?( p) e8 w) D, C8 u使用下面代码,对内存使用了mmap函数后:$ T4 l, p9 `4 o
#include <stdio.h>, z" I' J& Y6 b1 z6 s3 a3 o% `( ~
#include <unistd.h>' `+ p% G% d4 t2 z: }
#include <sys/mman.h>
8 t) n8 ?4 V! M" I3 I#include <sys/types.h>/ |% X/ \. y+ b0 q& w+ l( N: e
#include <fcntl.h>; x) }) d2 i2 [; U9 W6 h7 C
. o4 }# W2 Z% t3 O$ a9 ?1 Y. T
#define SHAER_RAM_BASE_ADDR (0x80000000): E: u) @7 {( B" P. ^, I9 N/ H" D/ @
#define SHAER_RAM_SIZE (0x20000) 6 u) s2 F, W* m! z, N7 K L
( I8 ~* X$ @& b% ptypedef struct
|3 N0 B3 \. i6 A' C{
& ?0 o G! e+ s" g/ R0 z" R) s7 l unsigned int a;% k) V9 I1 m1 A4 J& j' i
unsigned int b;
+ h! m8 N# U0 m% C1 @# { unsigned int packet_cout;
5 P/ K0 w/ r8 K7 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 A5 Z9 [# c x6 r- G1 D/ c! G1 D# I
& w& [" O% A3 |! Y# g- |: ]5 i
void read_MSG_buffer(int *baseaddr);, `# ^4 \1 x4 Q5 _2 _4 L
unsigned int count_copy = 0;
+ R; n1 j2 d/ k6 `. q }4 k2 a/ W4 x* }* \; b
int main(); w9 `2 [( K+ p# X6 ^
{5 [0 ^ Z# p: d5 a
int fd;9 X6 u* i; @! O: s; ?2 M. B
int *mem = NULL;
! E6 T% ?# ?' `# w+ c0 T1 K8 v8 S4 X/ N
if((fd = open("/dev/mem", O_RDWR)) <0)
2 Q3 s/ i" s; r( M: I# B {
5 v/ p6 K& ], G/ V8 t& D! I perror("open error");( j7 D; d7 g, j! U) ]$ V1 U/ p' u
return -1;1 u7 N" C) u8 N3 _
}) z; j( r8 w! C' I8 }! E8 W+ x
, ?; z1 x8 j6 Z8 a( G
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); r' E. ~% L1 _; k- s0 p1 @
. {4 X4 g4 p; U; s% ?, \
while(1)
& o9 G; q% i. w {
( X2 \8 W4 {% D read_MSG_buffer(mem);
: b+ t2 U% ^7 W* ` } 0 c6 u% s% Y' N% ]. k- v
}
! N" F" x) c' V$ F6 ~0 c( A
* U# A# E* W# V+ e8 gvoid read_MSG_buffer(int *baseaddr)
" P, Z. Z" k8 {{6 \4 a# _9 z3 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ I4 ?5 S( l' \
: ^% |+ v2 [0 B! y3 Y3 j pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 a* y7 ~0 n) ~) m( ~, d$ A) l: I U- Q* T5 n2 Y* x: Y7 c
if(pshreRAM->packet_cout != count_copy)
, ^& m* p# F/ `* N4 T {
6 S; t' E1 w6 d0 q5 W x7 P printf("a is %d\n", pshreRAM->a);
8 m) z' y) a0 Z* |& {0 r( Y; t+ [. r printf("b is %d\n", pshreRAM->b);
# U, H4 o' x& l! F& [( U H3 C printf("count is %d\n", pshreRAM->packet_cout);
! V+ N# O3 w: o count_copy = pshreRAM->packet_cout;
7 D/ C- q4 S x+ N, a- N }& D% ]( Y; N* [0 T6 d
else& k. m% U( N. q1 U
{
/ Y; s% H: `! O& k* W# G printf("No effective message!\n");/ ?4 Y8 i7 ^& t0 I; u
}, O; e f6 U5 p( x! N1 }
}
0 Y# \+ q4 d. @! w1 j" Z4 N/ ~! O4 G( n8 v( }: m% m, H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???# b& Q+ _+ i8 _* M+ n; q$ I- G! L
" N+ Z0 ~9 q9 |
7 V) o1 g2 U+ \$ g
) k6 T, C% A( s8 [- k
: d; T7 y4 `" t) t/ c' q8 S |
|