|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 A2 q% a0 K6 x; J: f2 B* Q
* M* P* N0 p% }OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; q! u, V2 u4 X( I#include <unistd.h>0 z; w% t5 e7 ]$ G4 [
#include <sys/mman.h>1 J, N+ U8 B6 m9 r
#include <sys/types.h>- U1 V' k0 E g p& O
#include <fcntl.h>
7 d; {0 Z6 S0 d$ ^$ T( P8 I8 k8 S5 C' n7 _* v
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 `$ f( j) W; [( j U, p* Q+ _. L' D8 g' a
typedef struct
8 J3 C) O# a) f! Y4 M( I5 M{
# J* e8 k4 j, J unsigned int a;
: i9 d5 x. g/ u6 {7 m" L unsigned int b;+ F: K9 K+ g; o* e" g
unsigned int packet_cout;" }- c! g1 p# X; j) G- R# x" u# t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 p4 Z5 P) v/ ~* q4 `+ n# _. j e, o0 o. a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, n. u4 v3 F: wunsigned int count_copy = 0;7 W9 _- S, ^& {9 W1 {6 ?, o
% z0 X8 v* \6 e: e" r! H$ o' L4 `; a- d
int main()
8 T- z: P. G+ h; }& k4 c3 k{4 N6 r/ T- K# j/ L7 m0 _# k$ V, P
pRX_MSG_PROTOCOL pshreRAM = NULL;5 D5 Y& b& t4 o* @9 W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ y7 A& P0 R2 f a* r, a6 I
' {3 m/ O0 g$ D while(1): D8 Y* [% m- l% s
{
2 ?! X, b. k4 X+ o k1 s G% y6 K+ R1 r read_MSG_buffer(pshreRAM);
' N# L i# e E. ?3 N } 0 U0 n- |# K' s" L: B3 \
}5 W, m& h3 y! u* B: I3 o
& M, i/ V* J( ^( b2 Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# }& [8 S2 ?* T6 I+ W! K
{
% t& S* Y# e ?$ V/ v& V RX_MSG_PROTOCOL buf;
, t& i# t" Z I - Q3 T5 j/ O$ }' d/ U
buf.a = pshreRAM->a;
7 Z; o' `5 s" d' d# ^, E buf.b = pshreRAM->b; a2 t6 N4 O: o3 t7 ?! ?; _
buf.packet_cout = pshreRAM->packet_cout;" _2 Z, P6 r' O l
5 v. j/ A1 G3 n6 E# i2 } if(buf.packet_cout != count_copy)
- B. |' d3 S: `4 o {
5 C0 C, g, ^' I5 c printf("a is %d\n", buf.a); \- ~3 K# H+ v1 z$ W
printf("b is %d\n", buf.b);
+ j! d# ?/ ]$ Y6 H0 w# v# T2 R printf("count is %d\n", buf.packet_cout);/ r; k; p ?6 {) Z! `, Q$ T9 K: D
count_copy = buf.packet_cout;
" H/ U. {" z8 T& q3 c }
/ _+ [9 Y, ~) h. \7 m4 h* T else
, s8 w6 g5 ?9 e: I7 }* f, O {! H5 t4 s0 F! ^# ?
printf("No effective message!");2 h7 l' D3 Z8 f
}
0 \8 W* v0 l$ c2 m5 c( }}, f! W5 f8 s, n' S
, {- O J1 ?; o! I( @8 l X `
2 {+ ?/ e4 X6 n I; V6 |2 m t1 b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" P) h8 P; K. P3 c9 W
使用下面代码,对内存使用了mmap函数后:
/ o, K. y* d5 Z; n#include <stdio.h>
2 Q/ F9 R9 P2 Q8 h6 X#include <unistd.h>& U+ T( k+ G; T+ x M4 i
#include <sys/mman.h>( S0 O) U# R O
#include <sys/types.h>
5 O' r. {6 x a8 p* r5 `, o#include <fcntl.h>% D, k( t2 d, M* z# x z
( U! T+ e9 ~: s4 R; M. i
#define SHAER_RAM_BASE_ADDR (0x80000000)6 q* D/ v2 c0 A& `6 A! \# k
#define SHAER_RAM_SIZE (0x20000)
5 |& N6 p/ f& a2 f4 F+ [3 K
/ p; @! Z4 j4 Vtypedef struct1 P* c: b3 Z+ N+ q$ D* u
{* R# x' `# d; g* h
unsigned int a;
; W z9 P9 z5 i2 h5 n `6 `3 q9 G unsigned int b;
2 E; R' {" u/ ?3 r# M unsigned int packet_cout;' h$ \2 S3 v2 P6 u. L" G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ U( u2 Y2 O+ N5 _3 X1 j2 w9 n! Y7 L% G
void read_MSG_buffer(int *baseaddr);
" A n. i) j7 }- V, a; Q6 Lunsigned int count_copy = 0;: P; ^9 L1 W$ ]4 A$ z( \6 C
0 X1 N- y4 c3 E! S/ b5 rint main()
" V; M* p' j B- }6 b* ]{8 n4 q! S8 T- R4 `* {7 C, C# R
int fd;
' O4 e# H. w" d7 E# K int *mem = NULL;0 Z/ N9 a/ y8 a5 d- V/ A
5 J, u: ?+ A% t( j if((fd = open("/dev/mem", O_RDWR)) <0)! M! j- O1 E3 k
{
( _" m" v9 H6 L8 j7 g1 q8 I perror("open error");
' I% T$ e$ h& f4 |3 T return -1; y1 F4 X" x$ y8 |! H1 @* h
}, s/ R3 X5 p8 X$ u: ~3 @+ \
4 t/ E$ I0 g2 P0 A" Z. ]
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 b+ ]5 _/ X* V" Q6 E7 w$ |
, \% l; Q i2 W9 S; C$ d while(1)
/ J; \6 s" E* v {
s8 U3 A8 f0 X: f) ^ read_MSG_buffer(mem);, O! p* y* I; A+ c: S
} 7 y4 Y3 g/ f l# M: l) `+ s8 g
}) l+ w; C; b8 {# v1 G
2 p p h# G2 J2 m3 i0 Lvoid read_MSG_buffer(int *baseaddr)
& ^5 n) y, q7 c{
e; `- u% `, K$ e( g% w pRX_MSG_PROTOCOL pshreRAM = NULL;
R8 n' _/ \2 M/ X5 q1 \' H3 }& Z. |1 u& E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 f, {5 R9 o8 ]0 d: I Y
, G, K, }! W" l& \' @8 u& ?
if(pshreRAM->packet_cout != count_copy)8 N- m) ^3 O' I( z$ _) Z& _8 k; `' j
{% w1 Q0 a% v$ V! N1 c
printf("a is %d\n", pshreRAM->a);
5 [7 r& r, s# a( b printf("b is %d\n", pshreRAM->b);6 b6 B% S, [; {9 N
printf("count is %d\n", pshreRAM->packet_cout);8 S9 Q Q4 m) _
count_copy = pshreRAM->packet_cout;" J6 o7 Y2 Q* c, j1 b
}8 ^7 ^% C; D$ e1 L
else" Z, v3 W: X* [* G+ ?; g
{, ~7 C! ~" T5 e& K8 W
printf("No effective message!\n");
2 y: O5 n9 @" L! F3 L }" c8 A; U" d& m
}
4 Y, j& j: z1 v/ v7 W3 _2 z; m, t8 T, T& ]0 X n. R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' Z7 p5 a4 f' X) t: {
/ A0 z7 H5 K& e! [' R3 }3 `5 p
& W9 w! W' f& Q: q. t* h
+ D# n, T) t# g
7 d- h& a+ x" J2 x( j$ r |
|