|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % w4 {! u+ b1 r2 h
: B' J$ d, C' J* ]- y: qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 J( D! Z1 t. P
#include <unistd.h>
0 J% Z% X9 B5 }; p/ q+ S6 W#include <sys/mman.h>. Z- y) h2 V" }( f$ R9 {
#include <sys/types.h>% p0 h& K8 ^( U
#include <fcntl.h>
9 G; O/ n! g% i& \0 x- a# {0 k6 b" ]0 N5 D4 e0 x; O! x2 {
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 B8 F; j0 F$ F0 p* ?
+ `) A1 T- O3 j i/ G$ Btypedef struct4 T2 S! p7 K/ Q' B# Y
{' j' \6 b1 I' L2 r6 X! Q5 }7 `& p
unsigned int a;. r- Y% u2 Q) g+ c* t( i
unsigned int b;
# R2 Z& N" x) A& o( z! m: | unsigned int packet_cout;5 N. i4 _& {1 z. [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ Q! n4 L4 { C; Z: x; v- [: U7 `
. K, e% W! @/ N" D0 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 e4 k! z% ]0 g' {. d3 g/ v
unsigned int count_copy = 0;; M0 R& a. V1 y5 d9 @5 V
' h- h: y2 V2 Q" Z2 V1 \% a8 i+ p; a- V) m% W
int main()
8 i* i! W, b0 t" X# P" k9 \& e- p: `{ g3 \8 h4 ]5 E! R
pRX_MSG_PROTOCOL pshreRAM = NULL;$ b, U+ K$ j. l! c" i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. x& v" J. r* Q! e* K' G0 V7 U9 k
- E4 i5 M0 T# \9 o
while(1)
/ ~! E1 ^9 H8 n0 M$ S5 r z$ x5 o {
" b! p# b$ u& o, q% v read_MSG_buffer(pshreRAM);
4 `3 f, d8 m7 `$ h+ E) l } 9 ?" ~! X1 S7 v; V5 d5 y3 z
}
' N0 p0 _4 H8 e' F, ~; \+ P; s5 J! U/ ~( H* P o, [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* ]( @, r1 k4 C- D8 V3 b" r. g
{
( n1 D& ^9 ~" Y' r RX_MSG_PROTOCOL buf;
9 w# v- [9 B7 S1 I9 B
# o: ~5 k$ p q9 B buf.a = pshreRAM->a;
9 k* r/ ?; v) a# V- d/ Z4 _1 N buf.b = pshreRAM->b;
# [6 X4 o/ r$ R* z buf.packet_cout = pshreRAM->packet_cout;- z; N' R7 Z4 g! y% z
9 @' K5 ^, t+ G, Q% U, ~* W( ~ g
if(buf.packet_cout != count_copy)
) c7 w' e5 P/ S. T0 i/ N {
5 E) d+ j: C3 V! M) r9 z printf("a is %d\n", buf.a);: }( w) s" i* \3 a; i
printf("b is %d\n", buf.b);
+ [; Q% d" u1 ~% m printf("count is %d\n", buf.packet_cout);
- [# v' H7 e) W- M9 v count_copy = buf.packet_cout;
2 F% H* s9 C5 d7 i @) ?( {7 j4 Z }) _0 D9 F D! ^
else
8 C8 O$ S2 j: k8 F {
" J. x) _& F, W2 r) [0 q printf("No effective message!");; E* _" T: M6 M( ]5 ~( s
}
6 K. K U; I% H% K k3 `% V}
( V0 W" O1 ]6 n6 F) z/ f) c, A' y* C
9 H4 W+ P Z$ w! w- \$ q- K+ W7 ^6 r/ d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% i# g7 b6 }' v! f( ]- R使用下面代码,对内存使用了mmap函数后:
3 l' x* x/ E% [#include <stdio.h>
5 Y0 R, P% x' {$ i7 q#include <unistd.h>
6 x, s7 [1 R" g/ {( U$ C#include <sys/mman.h>/ R- q" x' F k, _ l) g/ [+ `8 p
#include <sys/types.h># i! a, j1 }* K8 U( Z% i9 X/ N
#include <fcntl.h>: D- }9 L$ B$ o$ E
2 w& r, U; |; X9 C1 N+ Y#define SHAER_RAM_BASE_ADDR (0x80000000)! ]' x8 X8 m% @8 ~
#define SHAER_RAM_SIZE (0x20000)
+ M+ E* W. ]" ^! I( e7 ?
& D4 A- I' y; E3 stypedef struct
4 t/ h4 n7 f n1 k3 D, n8 [6 S{
% v2 v+ o0 m) P2 S" @7 L unsigned int a;3 Z. A/ K! k7 M. S' K
unsigned int b;, d w6 _1 W2 |7 {3 t
unsigned int packet_cout;0 ?9 Z+ e y& a7 R. x8 c9 E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( Y6 G; h+ s9 V% U5 a/ S
* ?3 y1 `, n9 y4 `void read_MSG_buffer(int *baseaddr);
! l4 p2 Q0 N$ k( A' E# c p/ u; wunsigned int count_copy = 0;
5 P( K3 D/ H" z0 V# B+ ~6 n2 \3 J$ O. R0 a4 C# [& q
int main()
1 S9 S9 y- q' m( E, k1 }{/ o B' H6 w8 Q7 t! x
int fd;6 D/ M/ |. e; M3 ?/ l h
int *mem = NULL;
% E; d3 q: i! H, G$ ~, |; h0 F1 q9 m& D5 y- S, U2 z* d
if((fd = open("/dev/mem", O_RDWR)) <0)
, M# o3 q* p; M+ ]: B" t1 A {
+ A9 t$ j! g) }6 ^" U D+ X perror("open error");% l/ |2 x+ l# r r( x, B4 |7 b
return -1;
( a% Y# `/ m( K/ K( M" I4 b% [8 S }
* N k: q. j( R- K; E 2 N# |0 c1 h" Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 I ~5 d' Q4 E" t# ~( ~, M
: { z3 y- u9 _1 Z& X8 Q- e
while(1)
/ v* [4 U+ w( Y! ?2 @& F# C7 g {2 k' d* s( e3 u. k! R5 L3 I- e4 u
read_MSG_buffer(mem);
0 t/ ]* }% r% e1 A6 E; l }
$ v1 U- n! w) c( h9 U3 c- a* T}
! a5 z7 K( |2 v. N* t" ^( W$ x3 O! L/ h
void read_MSG_buffer(int *baseaddr)
( k$ _& H; Y, _ S1 ^{7 D0 @2 V. D1 R' n
pRX_MSG_PROTOCOL pshreRAM = NULL;9 j9 o* H' `" ~4 T. N
3 s' A! i; N" J8 a6 H* m
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 k1 ?% w; W4 L2 Z% y8 \/ _' B
; z0 ?. b- u) L/ L4 X# V" |- | if(pshreRAM->packet_cout != count_copy)
$ L5 R5 g4 t$ [: ` {
! |5 k) W0 z( G! l" y1 F$ _1 ^ printf("a is %d\n", pshreRAM->a);$ b2 c9 T4 Q" f$ D# u# h4 K
printf("b is %d\n", pshreRAM->b);
2 \6 l+ V# F% f `2 h printf("count is %d\n", pshreRAM->packet_cout);& n3 B7 w# U" V) j# d5 J: g
count_copy = pshreRAM->packet_cout;
9 F8 u9 y/ {- t+ r8 S }' d1 l" e( w4 J2 X
else
$ V: B a' j8 a+ a {. N, }) K1 C& A' R+ a# T" c
printf("No effective message!\n");+ g2 v1 ~. g1 n- o! E0 J
}. O" D2 N2 \/ ?. M T+ t
}
1 h' c- K. ^4 e8 i9 N( A5 T- g4 `% e5 `- f) n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 q1 ]7 ~' I# n* M# N8 o: h7 K4 s7 n# A' h
8 n0 ?5 |$ n4 C6 y$ u3 K% P, I+ {
' ~6 n k$ I% o+ S8 T+ d1 u5 k" t* R
|
|