|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* A; J& q+ l" C" T3 S1 T' B W6 k0 \" e) r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- H5 k: p( V' C! ]$ w1 Z4 L0 H#include <unistd.h>1 J- i! O# Z7 w' ]/ c
#include <sys/mman.h>6 D( ^8 p4 f6 z& m9 K0 u9 u
#include <sys/types.h>
5 H7 g! Q/ J" O( y! N; B. u9 c ~#include <fcntl.h>9 `% |0 [/ C7 j2 c; C; V. b: ?
$ A$ N" p& A* W& }4 W* L- }. Q#define SHAER_RAM_BASE_ADDR (0x80000000) 6 ^% o8 p. T7 f+ r0 n
: Y0 \# D" ]& gtypedef struct% W( w3 C& m, Q2 ^$ ]" W
{
* T# A9 Z# u# O" t; q; l5 c# t# N0 { unsigned int a;5 G) Y: g+ z- O- t
unsigned int b;0 u! O( j6 [9 N! |
unsigned int packet_cout;
- n2 H- ?$ P1 _" [% B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 p! g6 C* ^: _9 D) I B/ t
, o0 T ?/ L; _( M$ n6 a+ pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); V% F$ V, _& C+ [) y+ y& \
unsigned int count_copy = 0;' ~" ^" a8 o. J' o1 I3 r$ Y
8 K" l, Q* S) K- f( \
' M2 u8 P7 v# e) ]. D2 C/ i9 rint main()3 R* x% S( }/ f$ Z% F% J8 x
{
& F5 `: n7 X5 F9 w pRX_MSG_PROTOCOL pshreRAM = NULL;
: \# M9 P7 M) n& l( ~4 d; s pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ f% _0 q( n' H# g( p
8 |, F$ s* R, ?: ^$ R5 O while(1)
( X2 U5 }7 | s9 S { ]$ E% V$ r* e5 u9 b! x
read_MSG_buffer(pshreRAM);
2 }2 P7 p; n7 j! D0 C$ a5 R _ }
) G- O2 `1 `" M% s! H}0 F! f; B8 Y$ \. c4 R2 m3 ^
9 i& ~( i7 Y6 `, J6 {2 z# mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: p* j7 q# {# t{; o# U G% _5 |1 F
RX_MSG_PROTOCOL buf;
, l3 R3 A4 h, W
5 x. F6 r, ]2 \. {: X7 U& B buf.a = pshreRAM->a;$ E3 Z1 n0 E8 S, d o6 S- B
buf.b = pshreRAM->b;4 r4 B& m+ D. R$ S' f; s; e; W
buf.packet_cout = pshreRAM->packet_cout;
1 K4 [ ^- d- Z: E# Q& g9 n! i y 5 ?+ R' w9 p- f6 L5 A! m' a
if(buf.packet_cout != count_copy)! S) _5 s* U6 Y% b8 b& @1 o
{, t; B5 a6 v8 e2 W) s
printf("a is %d\n", buf.a);( r: y% b4 o! j7 v; v
printf("b is %d\n", buf.b);
3 q) B, u+ l; K printf("count is %d\n", buf.packet_cout);
% v0 {" F) q' M/ w9 x6 X count_copy = buf.packet_cout;; U8 ~) p9 a9 _' t) s s
}
; O2 C& H3 k6 v3 N7 J; M3 Y else. a4 }+ _6 x+ c0 k/ V; o& ~
{5 e3 U9 m' S9 Y7 u* q
printf("No effective message!");
' n% X+ x4 B: C+ Z1 J }
; U: h; ` z7 ~6 {) S% @}/ X8 q+ c+ W& J1 s
r+ ^3 x8 p0 D6 F! M/ D4 G
n4 O! T \4 Q0 V; |) i" g但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 U& v& P' v' O6 f! A使用下面代码,对内存使用了mmap函数后:$ e7 z- O6 F% M1 n6 M
#include <stdio.h> l7 _3 h2 i8 Z# X) |3 u6 m4 m
#include <unistd.h>
/ Z5 x8 ~! \' q! k _+ R1 c: i#include <sys/mman.h>. Z* |; e; E4 r( b, n7 j) L# f; b
#include <sys/types.h>
. s* g- k8 d4 m) j- Y* Z; r' V#include <fcntl.h>
$ U# H1 w `; S2 D3 T" r5 P1 q- z8 G
#define SHAER_RAM_BASE_ADDR (0x80000000)
* M; x6 a2 K: I# z5 c" {( z& w, j#define SHAER_RAM_SIZE (0x20000)
8 Q: |+ X& H5 L3 C G
/ v. D2 R8 {/ \/ I. z- y) Ztypedef struct
2 Q* n5 W* u1 U' n* x# u{0 v7 M1 i& o7 T6 D! f# \: o/ B- [
unsigned int a;
5 |1 l5 J! [3 ^+ E unsigned int b;
& d0 z, B, }4 Z; ]8 l unsigned int packet_cout;
/ m+ |5 _4 @6 b; w7 @' ?+ y4 G6 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
f0 f* c! c+ D, q5 X
" [( M# z. J# `- N$ L1 O+ Z2 ]void read_MSG_buffer(int *baseaddr);
& p+ x1 T3 u! Y8 v4 Punsigned int count_copy = 0;$ V! U* ]% |9 ^! r9 M/ R6 @& o
3 p* R2 j" Q- S. I. H, k
int main()
% Y3 ~4 u$ S8 O% X# C. b5 J1 i3 |) T{( \9 P# D4 |; n$ `" u
int fd;2 @: W0 L, E) P8 k( Q* l0 N2 b
int *mem = NULL;0 O5 L# A; d1 E
* K: }9 R* \' r7 }4 a' A
if((fd = open("/dev/mem", O_RDWR)) <0)
0 r3 p( B7 w* ]7 ?+ V+ T$ |* ~ {, R, s. x0 z' v, S5 @, d0 [
perror("open error");+ [/ w! [4 j$ C- V8 x% n
return -1;" E: u0 b' Z2 v, i
}
0 T# k" F; t4 Q
2 ~# g, F( C6 `# y ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* U/ i) I$ n7 @0 Y) J
1 l5 Q! m. y% z5 z$ q/ J( V! N while(1)
- }6 e" n$ w1 S! Z {
: m7 t& @1 |) ]5 [& @4 A3 `8 U0 X read_MSG_buffer(mem);( U& R, B, \" U7 a- B1 ^, p, G {
}
6 l( B# b" k0 I! A/ Z, O& D5 X}+ J/ v$ f; a: U& }3 e4 C. I( D2 r. T
- T9 J" e, G' o. mvoid read_MSG_buffer(int *baseaddr)5 b+ ^, U: n3 P$ I/ x
{% {6 n. M, f3 {/ c# t6 v
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ N% B; Z( Z# b8 H9 i0 s
, j) ? N) Z1 \$ w: i pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, {9 Z" ^) e. |/ V n
, P4 @5 C, u$ d Z if(pshreRAM->packet_cout != count_copy)6 g# I% b/ |: `: J
{$ y) S& p$ r6 h' Q) S0 w5 m" ^
printf("a is %d\n", pshreRAM->a);4 G2 @2 O7 Z& W0 E ^
printf("b is %d\n", pshreRAM->b);$ x$ D/ q- [& T# w( v! Y4 E. [
printf("count is %d\n", pshreRAM->packet_cout);
/ v( I/ n8 C1 |2 c5 N count_copy = pshreRAM->packet_cout;
+ q4 q5 s& B9 d( m) D }
- c1 Z- C; f8 M8 ?* M$ k3 g0 O else5 M9 c6 u* `5 p5 ~
{5 Q1 C2 g9 L1 k. m
printf("No effective message!\n");5 q4 b/ e+ E ?
}
" h8 X2 X I% q% p% H/ f2 h}8 _! J! u# w/ O$ s$ t- z! Q
" s+ C# y: Y9 t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( c' V. }! E7 G" T9 R- t; x6 S1 M7 K/ K. i- k. o6 c$ j
) K: ^9 J8 d% c8 I# ~5 m# K2 l
; X/ ?3 X: W- w9 D
. W Y, d6 q3 E$ V
|
|