|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / I, t8 }2 Q, \3 O/ q z+ c
8 T/ y3 t, S' h, y4 F/ y" YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* u/ J) B% q6 J! y#include <unistd.h>
8 e) C' f, Y+ u. \- e#include <sys/mman.h>
" u9 n; x3 k# g' D0 [+ ]! F8 k" {$ K#include <sys/types.h>3 U3 m- A# K& ] s0 ^
#include <fcntl.h>
, y! r/ r: r: r0 D- Q$ Q
" c, @; R1 _+ `) A#define SHAER_RAM_BASE_ADDR (0x80000000) & Y$ ^; N8 |7 I% d( X4 @- _
/ X* F$ P9 b0 e9 I3 b6 q8 mtypedef struct4 c1 c/ @* ?# R T: m) i `. M
{" Y! {! ]7 |, d* R3 |" `0 n, ]
unsigned int a;
& u0 b' E3 F2 G, V unsigned int b;1 [" m' G0 h6 P4 s* h4 E- [; }( @% x
unsigned int packet_cout;
& u, D' _" V! |& W2 X Q( V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ x5 s2 X2 R. c! U" [1 e3 q
' V \* G7 F' P k9 h" hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% Y' J5 h, V$ u8 junsigned int count_copy = 0;: A+ P! P4 p0 h* e! _# U
/ \+ Y+ B/ x) `: B% L+ b/ ]- Z( _6 X- O a) \
int main()* V5 k2 ^- T+ c
{
& f/ v5 D+ G; R# K2 z/ V9 |( s pRX_MSG_PROTOCOL pshreRAM = NULL;$ R0 u& X. n# E& _* X: A6 v
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 j; `/ F$ e8 q6 m9 z* W5 B
: i' P3 f! A8 I& W while(1)+ T3 U/ z( v) a: d0 X4 M$ J$ {
{
u" ^1 |/ R. q9 l$ f read_MSG_buffer(pshreRAM);% J! Y# q# b6 u4 |2 h
}
1 |: ?5 b+ i4 V* J K}9 L6 a, G. R7 Y7 Q5 U
+ l' L1 q/ n6 P: f) Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" m! l5 m. T9 p' x% \# H+ A7 w{/ h- R6 O5 K" A1 t" o+ u G
RX_MSG_PROTOCOL buf;) F4 q4 u O' i! m, q$ Y4 Q. n
8 n! v" |: e% [6 m; b buf.a = pshreRAM->a;1 E1 t4 z) j8 e8 `* A( O' ^
buf.b = pshreRAM->b;
2 }, B% t* {( E, t- b( E3 C2 g buf.packet_cout = pshreRAM->packet_cout;
1 `2 z; Q0 |' c0 l! p# |* V- l/ i, M ( p4 Q+ k. A/ Y R; b+ a _
if(buf.packet_cout != count_copy)0 t4 ~" t. W& f) \ b
{
0 t, e8 F9 U; Z& w2 ?% e: A- k% S9 d printf("a is %d\n", buf.a);
* D9 @( Q; t0 ?3 I1 Y printf("b is %d\n", buf.b);
' p3 X# ^3 T) B printf("count is %d\n", buf.packet_cout);
5 r7 U% I) B2 B$ |) M count_copy = buf.packet_cout;0 x* C5 L* v; k3 E, j
}
) T7 \9 H5 J$ n. W else
% U7 _# m. c4 d$ a {! M) f* ^- E2 v/ N' A# s
printf("No effective message!");. x- Y' e* K2 ~. v
}! v& c h. R* T6 I* U5 d
}
8 C* e. s4 p& B/ v- t+ v% q$ `, h. R/ m% n8 G% a6 y
3 ]; ^9 ^: f/ Z" Z5 H但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- F6 }, P9 }! i. Z
使用下面代码,对内存使用了mmap函数后:
7 m v* p4 d2 Q#include <stdio.h>! I4 }4 x8 s. _" S& Q% p
#include <unistd.h>7 q0 ~. I, \6 R i
#include <sys/mman.h>" X( S* D. w5 s$ B, n: F2 ^
#include <sys/types.h>4 w' D5 j. C1 n, m/ W( q7 z
#include <fcntl.h>/ B2 Q o7 {& b& w3 z% y) V V) }2 T1 S
6 g+ c$ X7 Q; F3 K) Q1 t0 V: M# h0 i
#define SHAER_RAM_BASE_ADDR (0x80000000). G) X* R j& x+ w& h/ U- j' ~ g
#define SHAER_RAM_SIZE (0x20000) ; H# v) c( E5 c: |( a5 a
: b& L" s( z. o9 s& H) Q9 o) ltypedef struct6 U; V2 T7 G: U$ o7 t3 B: A
{
' o5 J' Y' p. T! K unsigned int a;0 k5 z% B$ K2 d. i2 g6 N1 C3 c( R: ]
unsigned int b;% w( X* {4 u7 b4 Z$ y$ L. R
unsigned int packet_cout;
9 }3 y/ c/ B' v P}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# o. f' z" T7 t9 n2 b. y! u
8 H4 M" k( o3 X" ?void read_MSG_buffer(int *baseaddr);4 |. S) }5 m- M' ?. p4 e9 v; t
unsigned int count_copy = 0;
/ V4 ~4 h3 U8 y! o% G* Z: d/ v" O- D
) Z, ?" i. M% i' Z# [% S7 C& Z6 wint main()) w' Y1 f2 X% B
{$ ~* ?" K6 s& ? l/ v
int fd;9 J1 z( y% ^. U+ E* D
int *mem = NULL;
; J- S, `3 H6 o+ ]# [+ _
z5 `) Z2 m3 z& z: k if((fd = open("/dev/mem", O_RDWR)) <0): B' Z3 y7 q2 D% c* F2 C' t1 Z
{8 Y0 Z! H, Q/ t1 U
perror("open error");& z( w! q) l, [$ e: Y
return -1;4 i! o2 s3 t! l+ L
}
7 j1 D# l) I. ~( G( v% U# q- S 3 _$ S) P+ c# Z: T# ?; J) M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% ^" t: `, K0 o
( J4 ~( L8 t) P P1 i
while(1)
; @& M& e8 W; x, g6 ` {) D+ f/ _) w0 f
read_MSG_buffer(mem);
5 |4 G' d! a" g" E; k" _ }
- \2 d* t1 r7 J7 Y k' s; q' C}% k, C' R ~- @ W8 G
9 L) I/ q7 W7 k8 Fvoid read_MSG_buffer(int *baseaddr) L; c0 l+ g/ G/ ^; H
{
! b( |& R$ ^% [/ N# a/ v5 v7 x pRX_MSG_PROTOCOL pshreRAM = NULL;
' c2 a' o! [+ ]1 `! M; f9 v
/ I W) U- o" H- \ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# d* T4 x9 ^0 |# d3 @
2 T- o7 h* Q) i8 ]" p5 E7 @7 ^ if(pshreRAM->packet_cout != count_copy)& ?. n9 n# f% v# z; J9 T
{6 c- V0 J% J$ G9 t6 `5 X W0 U
printf("a is %d\n", pshreRAM->a);! h# P, n5 c+ e
printf("b is %d\n", pshreRAM->b);
" u! S7 c: e: G) W printf("count is %d\n", pshreRAM->packet_cout);
, K/ c# k, n, \8 a5 T count_copy = pshreRAM->packet_cout;1 @1 j1 ?! s+ |/ G
}
7 a# y, b5 C N( U1 E7 M else
" U* T3 e. l3 Q( J {) m: P! f: m; N8 w
printf("No effective message!\n");
" q0 X: I+ z6 \9 d, I }
8 ]0 X' ]& E6 G1 b}
2 T* n6 F7 K, f) e8 g8 s
- I, T4 c4 d# f! X% }5 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! W3 b" {2 n2 e8 P0 x) C# j
* U, M3 H7 u" W* h
, Z0 N& C% R+ I" D8 i* z2 V! ~- |0 f% B9 n2 ~. M! D4 d
2 Z" \! q4 G) P B. w) h
|
|