|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 Y3 y) o4 @; N6 X
* {) o) o' _: w) S# j4 W3 Q/ \* i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 u( e; q7 S8 a: a' v3 W& y
#include <unistd.h>
9 P" k7 \5 p% A, f#include <sys/mman.h>. j, |: X2 B4 U2 B& n+ u
#include <sys/types.h>) N# s- t a$ ~3 ^9 o
#include <fcntl.h>
. f/ p! i3 D+ n* N/ A6 t0 \5 M3 e4 y! n4 d. k+ z/ m, ?8 X
#define SHAER_RAM_BASE_ADDR (0x80000000) # _! y: r4 r0 @$ J) J
( c/ c2 V$ H$ c# Etypedef struct
- m4 }* t2 A" e7 g{
9 u3 c3 C: L1 d' G- z unsigned int a;
! j' N! m7 ~3 @/ i6 h; f7 K: S unsigned int b;( G! ?0 j) x& i+ B9 U# ?2 m
unsigned int packet_cout;
3 u' g5 [' [7 m$ E: C! X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 E9 U m% _: _+ Y8 r& D# b: b
% U( X% \5 d9 \& Z2 F( L9 O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 J; ?5 J4 X+ W# b l1 T1 b8 G
unsigned int count_copy = 0;( B9 t, I* M( H& Y7 z) |; y+ A* m
* R5 Z6 N9 y( r9 f) }
8 p1 }& n) ?8 G% Y* j9 \. B( C& s& h' p
int main()- z% \, R6 p( r3 L, o x: k4 j
{
3 ]# V7 D+ L7 s pRX_MSG_PROTOCOL pshreRAM = NULL;5 `. }8 ]# H" l# {" G$ V3 i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 ^% s5 G. b* F: F3 U5 s( D$ E* Z
6 x, f" _3 ?! M m. H. Q: y while(1)
3 m& D* Y5 F4 c$ U {0 T z' p/ l' D H9 ]+ L0 @. |
read_MSG_buffer(pshreRAM);( u7 O6 w6 H9 `0 f% o
} , Q8 m9 H& a3 W( b0 O8 s& Y* |
}# x2 D7 _! E2 A
% p. K. Z$ @2 a/ K1 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) K1 P4 _+ {8 s) V2 o# n- v
{
( `( c4 _& q* t0 _$ {: f RX_MSG_PROTOCOL buf; N, n, {9 ~7 }' {( a, `! w @
4 d8 c, a! z* c* B; k: f buf.a = pshreRAM->a;+ J0 K1 b6 w! z* }& b
buf.b = pshreRAM->b;9 D& w7 Y2 Z( G% S
buf.packet_cout = pshreRAM->packet_cout;
/ B7 N8 z! M2 ^) F( l ' R) H( I M5 X: v7 h
if(buf.packet_cout != count_copy)
+ v8 ?8 L( ?" C {
7 u( ?+ t+ y: e& z3 K+ I$ j printf("a is %d\n", buf.a);
9 ~1 f8 }6 H- M" W4 |& s printf("b is %d\n", buf.b);
. D; z6 ]+ k W/ ~5 F printf("count is %d\n", buf.packet_cout);
: E! Z2 ]8 P$ ] count_copy = buf.packet_cout;& ?' r0 q0 z) _/ a" q7 e
}
+ f4 @# G$ c" u% c/ d else
( L2 b2 l% H8 x( O/ z/ Q7 u {
: q' a, O# v; m5 L4 V) u1 I printf("No effective message!");1 x* g9 m6 i- }3 S- a- L
}2 X3 S* E) B( w$ e+ P; `
}
}; P/ b# F# a
; v* y* F2 p2 N( S% v" h0 }' Z; z+ g0 b. U s5 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 w. J6 K$ ] V* L! [1 a3 n7 d
使用下面代码,对内存使用了mmap函数后:
. o) t; D0 W7 J3 X- T9 z#include <stdio.h>
* Y+ r4 X0 S( c# L#include <unistd.h>" E7 u& e, l0 g- O( C7 [- v
#include <sys/mman.h>
$ K2 k V' J6 y( _0 d9 Q3 W, a# ?( Z#include <sys/types.h>- [; T- R: F2 M1 V2 J
#include <fcntl.h>
+ e2 O! j" }6 @$ z4 K
; c& t% K) W' Q1 S#define SHAER_RAM_BASE_ADDR (0x80000000)& y8 `& W. r8 v! V! y
#define SHAER_RAM_SIZE (0x20000)
+ o) i5 Q* D7 ]$ R1 r7 v; F3 U q
: V4 _/ B$ n0 s" q- W( btypedef struct
/ E/ s- f3 T7 u3 {{
3 V: |1 V# l' u7 s unsigned int a;
% o# M) k+ ~5 u% n unsigned int b;8 S2 h0 P8 }/ n6 K0 K }
unsigned int packet_cout;
, }( D0 T4 J* h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* L: k% T; C( `; J$ [/ C' h
" i; U5 T9 O' M
void read_MSG_buffer(int *baseaddr);" |6 P5 R, K/ {* i9 ~9 z
unsigned int count_copy = 0;7 g+ n% F d+ J7 F
7 s1 ?0 r; p1 T# D1 |( k
int main()
* L1 ~ p3 u$ E$ j- K{7 _: v0 ?: j0 L* }: q
int fd;
{5 }5 s) d0 `! J5 w* D int *mem = NULL;0 x3 b' z5 R9 T
& J# @9 D% T/ c8 F- \ if((fd = open("/dev/mem", O_RDWR)) <0)
' l$ h1 q4 s$ y7 { {
) Z; `- o( P* T- u3 L1 U7 L# u3 f perror("open error");% J. g+ \3 y( k) h4 R* ?
return -1;
% D. v5 t% |' f/ ] }
# z6 p# T4 ]8 y4 y( U( v% Y : B& O# y* ^! `+ _* S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' L; Q% ~! I/ m2 M3 O$ M( [: t0 `1 O/ a
while(1)
6 Q% ]% }6 w4 O9 O- a {
& C0 F2 S) I3 z* y x$ w3 s' z! l; E read_MSG_buffer(mem);6 J( Q% K+ c' n. H5 o+ Q
}
6 k% x. ^. ?: v% D, M}
5 e$ l! ?' r0 x, x- l0 n
# d/ c |$ X" [void read_MSG_buffer(int *baseaddr)5 Q5 p9 Q$ A: l5 }
{# o, C- T- q8 W( j; n# r/ z7 n
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 n8 ^/ f+ c% X! Z5 p
3 A8 L7 N( K; @$ T1 ~7 D+ z pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 a6 `7 a- x* e9 R$ _0 B8 ^
5 @% f3 T9 `2 Z! y) t
if(pshreRAM->packet_cout != count_copy)! f) ?: F& C8 r; g
{ T9 }6 X1 }3 |' S2 ~) a
printf("a is %d\n", pshreRAM->a);
" }# ]& n( E) Q/ F6 J( M printf("b is %d\n", pshreRAM->b); r3 _& b4 B! m- a
printf("count is %d\n", pshreRAM->packet_cout);
# j: U# ]9 n' J6 G: H count_copy = pshreRAM->packet_cout;7 K' B: I. o- j. M( ~3 k
}
7 M9 q" q5 C) u0 G else! F( T1 H% j, p+ T
{
9 a/ ?1 K$ E3 T) }- m printf("No effective message!\n");
' y7 j# f5 Q3 j- K }
" s. X- @6 `. M4 U6 T: R3 x, @3 Y}! Q0 B# T1 U* X+ N
) @. ]8 M- e3 y1 g( ? P, j+ I% s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( g/ |. {' a% k7 V5 N. A7 Y3 M
" G6 O6 S. G3 m: w( D+ R. w* O1 U! C1 d
6 v* u" d6 T. S( E2 T2 C" ?* {
# X6 U' e4 b! Q, q7 A |
|