|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) m" |& a0 A, n' J7 B
' O* ?, G7 @ N9 k* U* i3 R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 r: g: \1 g' k3 `- ?4 g( ], y: e#include <unistd.h>
8 O) |$ b1 ^0 ]; F% U+ I# ]1 Z#include <sys/mman.h>6 G) F. \- d# Z* C. Y3 `
#include <sys/types.h>
) e/ Y2 K, f5 n( W- A3 j#include <fcntl.h>6 v5 p, v, M9 U- i# Z9 P+ N& m
6 t' h9 W3 ]& m#define SHAER_RAM_BASE_ADDR (0x80000000) 5 C3 d* H+ \/ P; }
' }) j0 l+ c) O; h; g) Ctypedef struct8 I9 Y2 ~' ^; w' U( ?
{
7 \% H) f5 G( w* B unsigned int a;
1 z7 ~" g$ ` t. F" K8 U$ W) [ unsigned int b;+ n$ V1 }- T9 R3 X1 P* v
unsigned int packet_cout;
# R$ ]6 W+ Q: A5 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- F* S% s+ P) @0 M* |
8 V$ {: A$ ^4 o8 V; zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
n9 p. Y' i' Q6 A' V/ wunsigned int count_copy = 0;, z+ D! a; Q* m8 m
6 C9 J$ C) H$ Q8 Q# X0 r9 t* o$ ^! o) }3 a. x6 E
int main()
5 a3 h$ y q/ u4 ~6 F; h{
, ~* n* ~3 I) ]6 a+ w! ]9 S3 [ pRX_MSG_PROTOCOL pshreRAM = NULL;
/ Y' ?6 J+ W' h5 u2 N pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; E! v1 I$ W+ ]' w( O' J
+ R1 w$ L) x. J8 a4 O2 C# k
while(1)
1 w/ F" `1 ^* F0 b4 p" ?/ s {. ]$ t; K: p- |
read_MSG_buffer(pshreRAM);$ ?5 ^: K" ~& K$ @2 c8 R0 c( Q
}
! i; | x# g7 D) @1 z, v) D}4 u( [- T+ F8 ]# m
7 f! Z1 C( I: A! G4 {) O& a+ E$ xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* o# W) m. P2 l+ ^+ z0 H{" S: h0 g3 `+ L& X7 B
RX_MSG_PROTOCOL buf;) [5 t/ Q1 r& |6 ?" d; u7 ~
9 |8 ]$ Q, h( E, Q, d buf.a = pshreRAM->a;# h+ q& q& P4 o& Y/ k5 N H% Q$ J8 U9 ?
buf.b = pshreRAM->b;- u1 K% C" R0 ?
buf.packet_cout = pshreRAM->packet_cout;4 j- n3 X% |, t* {) j, H# q* j- R3 R
3 m3 L N7 A& X: {
if(buf.packet_cout != count_copy)
; E) |$ z+ [% J. E6 R1 m8 j. b {" Q4 u( H7 v$ ]4 Q
printf("a is %d\n", buf.a);
% x: t% G: O+ O) v: C printf("b is %d\n", buf.b);
s6 {1 e9 _! c; h printf("count is %d\n", buf.packet_cout);
& x9 l+ R5 k! p/ @: U' q& ` count_copy = buf.packet_cout;; g' |, M4 i9 n0 ~0 P
}
' D3 W8 E6 o3 f Z0 _/ m0 V else! z% G, y" }5 ~) Z) _9 y3 Q
{
! [) \1 T4 t" d6 E4 ^4 v printf("No effective message!");
4 ?, ^: v/ Q/ x- u* _( d }
4 \' j6 B, z3 U }3 ^" k' h}
9 }# r* ^- k4 U7 m% W. m; v4 ?% i
) Y5 F6 B6 G; m. U. ^$ I7 O0 F- l
G" H. o* x0 z9 y) T G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 H0 V: x% F4 G' Y+ p使用下面代码,对内存使用了mmap函数后:
& e& m- l5 r/ q2 S#include <stdio.h>- Z/ }/ R, n' c7 d4 Z
#include <unistd.h>( M( j# Y* s- W! [" a4 p$ s
#include <sys/mman.h>
' R& S. ]) r# @ x4 Z#include <sys/types.h>
2 C7 t- Z. B( R4 M#include <fcntl.h>% g# A1 C$ U2 E' S) N8 U) m% Q
; U( h* U: r5 ]6 w0 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
. n) P, V9 f0 \1 b" g: j6 T#define SHAER_RAM_SIZE (0x20000) 2 @2 Z$ @" f7 r7 L6 x# a
% `, D1 D. b& |( r. I ztypedef struct. l* X0 X" T9 s6 ^
{/ P3 p* M* d0 `# u+ e$ G) R4 `% [
unsigned int a;
+ m5 {& m V; a4 G/ x3 c4 L unsigned int b;
5 n* _, }, `0 W unsigned int packet_cout;
6 Q& E; ~4 `+ g1 {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ P+ D6 i" B* E* ?0 |: r3 N
9 k/ ~0 Y5 g4 o) ~: {
void read_MSG_buffer(int *baseaddr);+ r) b7 L3 J, {' @' b; r8 Q
unsigned int count_copy = 0;7 n1 h/ Q% @' N
6 V2 i; N, E8 Rint main()
2 `/ v* j1 d4 @% U7 \{* W, A6 q9 l. C2 j) ~1 B! M
int fd;( `/ i$ M, e/ g7 F7 m* u
int *mem = NULL;
( i4 l+ I" r( v1 x
1 O0 k2 e. y, z if((fd = open("/dev/mem", O_RDWR)) <0)0 ~5 F4 R7 G, D6 x, D
{( z5 x5 d9 K/ x ?
perror("open error");* M% V- r$ F! X8 ~( q2 g
return -1;5 |5 c$ \* ]! J6 Y* C4 o7 K
}3 J6 g; T- p( |
2 q0 l9 u9 ^. Q. _# R mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 h6 a, V) W8 N. u4 z, Y, W: ]+ T" P( m+ d
while(1)& B7 \* i2 v; v* M% I
{
. v& B2 z/ r6 w L5 ? read_MSG_buffer(mem);
- C9 X$ e% y6 Q8 x H. u } ! ~! t6 I1 K: y% I- u8 M M
}" v! S; S- K1 `* l" R
9 S/ a8 ^: u; Q9 S
void read_MSG_buffer(int *baseaddr)
: u6 D: ~9 I- ^! K' m; a% V{
2 Q) O: h: m5 q2 h; d pRX_MSG_PROTOCOL pshreRAM = NULL;
$ ^- Q: B# `7 F1 @6 z; v$ n
2 k# w! R$ T, n3 y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! D& _* d, `! a% l1 \
1 |+ ?7 Q. o' I+ N1 i F, E0 ~# O if(pshreRAM->packet_cout != count_copy)) g2 J5 D' [5 W1 p! w; {% C* L8 x! e' \
{
) z" U% x4 \6 p6 i. S printf("a is %d\n", pshreRAM->a);
. B0 M% P, ?! H# h6 X printf("b is %d\n", pshreRAM->b);
V) R8 e u6 ~& E5 n( Q printf("count is %d\n", pshreRAM->packet_cout);6 b2 r6 r9 |% u" g( K2 j; n
count_copy = pshreRAM->packet_cout;& G( [3 C& H* m* O7 S
}
/ C6 W* F( \% j) U2 B# ~. R else3 _+ f/ h7 I' T3 M
{( [- r; V) t9 F( E
printf("No effective message!\n");
- C. \8 |+ o2 z4 {; h0 r }
8 M1 k+ x d' n$ _' [}! H% L4 z) X4 T. f/ o
% w$ j$ |6 w+ ]) u6 [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' e' l- z! ?% K% L% c* r i, K5 c
; s: ~# z' g: \# ?$ g# U N
$ {8 C* J8 D" T$ a6 Q$ g& n3 S4 t$ m ^: |% ~: X4 ~
|
|