|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: @ \8 d; s) l' ^: ?, ?+ i
* V3 h) X- ~! m$ R' H/ IOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- T- }* q( ^1 l# v+ h% E
#include <unistd.h>
1 \8 n+ F( A# o% h# G3 P" L6 a#include <sys/mman.h>
8 n- l/ ?; V z+ _% X# k0 @7 W( o; g#include <sys/types.h>
4 ~5 O! [" T0 g! C# i5 h, l% Y#include <fcntl.h>0 R) w6 O7 c, q2 A) \! u q" J+ v
1 B; j- t) t& g/ [# `* N#define SHAER_RAM_BASE_ADDR (0x80000000)
, ?% ?. f! x" i0 t2 n- Z4 b; c; \ s& l3 c
typedef struct) X6 [$ I8 {2 j) O2 ~% L
{ |3 ^" |( I+ K A- ?7 t3 w
unsigned int a;
# B; w1 v, E% R/ c4 p7 |3 N unsigned int b;
: |5 @% x- B8 a: f" Q) Q unsigned int packet_cout;
& @. C" Y0 e' e( E) C5 h0 \# h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 r, x1 A: ]) p# I
( V! r3 I$ Y- m: v+ dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) N. }8 T, ~# w2 \
unsigned int count_copy = 0;- x! N8 y; m& N1 f! J" M6 x/ b
. o; P% N$ K% x' p
4 w+ r* f! s3 c! c% i: P2 Pint main()9 a) I9 l3 n. L! t; x* u3 K R
{
, M+ @" }* g6 q9 P9 t+ a" g4 c pRX_MSG_PROTOCOL pshreRAM = NULL;/ e4 W. `* h6 j
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Z. b0 ~, f8 |4 x; z
' Q) D- G+ n: X0 j while(1): O2 r) |8 J. ?( q
{- Q7 h5 K7 P/ G- P5 _2 c
read_MSG_buffer(pshreRAM);- [2 b3 w c |7 X9 z: [
} ) N' ~) ^( f8 h4 H# c
}7 O6 A7 Q" @1 S
5 f0 O& e( _+ x2 g$ I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! A4 X; y$ X1 c, z4 K4 W{
/ W/ g! i+ ?" h0 W: T2 {: f RX_MSG_PROTOCOL buf;
/ q L9 ~- @3 l/ m7 j ) N# H' b- G8 F K4 g! |2 L
buf.a = pshreRAM->a;
8 R/ j7 Y0 O2 i$ \+ g5 S buf.b = pshreRAM->b;2 ?* g" x, Q- q( D a* O. ^
buf.packet_cout = pshreRAM->packet_cout;
+ U: I; m' c6 v" |: s/ q; j5 |6 H 6 R, q- o5 g+ i! }" F* G9 @
if(buf.packet_cout != count_copy)$ b% R$ e' t+ z3 Q. P
{
$ Z; F' w* F S5 Y0 F$ N printf("a is %d\n", buf.a);9 `; [9 N/ N, x7 _
printf("b is %d\n", buf.b);$ ^( x. T! S7 O
printf("count is %d\n", buf.packet_cout);
. J7 U8 V* o0 ~& P2 C& @ count_copy = buf.packet_cout;
+ ^+ R7 y4 _! d( E r4 J5 I% i4 t" l }- k" o+ {1 j0 \) W" z
else
8 T$ y- y" o2 e, |7 ? {) ^5 A1 q: K+ m" s0 w" G
printf("No effective message!");2 @% w3 R1 r" p0 C; V
}
- N7 X" F2 p$ M8 Z- c}
: H! ?! M: D3 p
. m F2 \, a, y; y% Y5 c; I' c& v$ R, `- |/ y- [/ q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. B1 C. g& u3 `: i) X2 c6 L
使用下面代码,对内存使用了mmap函数后:# ]5 O8 R0 y5 H8 x M% Q* w5 |
#include <stdio.h>
) h( E' L ^) t1 S- `#include <unistd.h>
6 C0 U/ E; }* L; h#include <sys/mman.h>
: }( v; C0 f& S4 i2 h& r" b#include <sys/types.h>- |# f' n- K. {) |* w: {& z& d2 f
#include <fcntl.h>- F A2 j! i2 E" A% X/ t, a
, m, g! b: C( {+ h& Y4 J
#define SHAER_RAM_BASE_ADDR (0x80000000)% i4 D3 j' U- L- I1 i! J v
#define SHAER_RAM_SIZE (0x20000) # \" K. S0 t( d6 y/ d1 H. g
+ D. R. d) D; a5 d9 M6 ]) b
typedef struct
& A6 W6 I% X6 n3 J4 h" z{
6 q. Q2 `( f# s. u unsigned int a;: ~* G; t1 {& `
unsigned int b;$ D+ e) {: {& X' X7 Z& [
unsigned int packet_cout;
3 p8 ~9 x& F V k+ e3 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ r1 s* \" O5 N
7 u6 N2 q. F# X! d( {& `4 _void read_MSG_buffer(int *baseaddr);7 D4 X" o/ {$ o S" ~9 \1 z( F5 h
unsigned int count_copy = 0;
6 ?/ ~& [: j7 F
( i8 \$ A9 J( j$ {9 B* Uint main()) Y# i4 Y Q ]
{2 f$ R0 f4 _) j8 _$ F0 J
int fd;
& P/ W3 H$ C2 W+ M2 Q! \ int *mem = NULL;
' @, [8 e# N7 n" z( O5 J. q
+ T) ?8 T, k8 _ if((fd = open("/dev/mem", O_RDWR)) <0)7 B' _: ~$ w0 {( ^! i1 z
{
5 p8 n, d3 r8 @7 j7 Y6 o perror("open error"); ?9 y+ j! k8 _8 P0 B6 [
return -1;" |, k, N. n3 P/ K
}/ K$ N$ O" b6 M: B9 ^) ?
' C# U( J6 H* K# |1 [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ \: `. ^2 z& ^9 Z8 ]* ~# M$ \5 ~+ [7 u$ k
while(1)
+ r: u+ x$ H( |& i {- q& q( Q9 H1 f, f* E7 ]
read_MSG_buffer(mem);
: h- a; g# L" ~4 u$ Y' f1 a" q# a7 u } 7 `6 T* e# ~, P
}' t1 I- L, i0 b% G; Q9 {
5 f& _' m9 Y9 G- R- l rvoid read_MSG_buffer(int *baseaddr)
; @( v1 p, b0 v{( l: \! O _7 Y- S
pRX_MSG_PROTOCOL pshreRAM = NULL;. F3 I p* w$ f3 N9 ?. T# e
8 X* B8 X4 z5 s. o c pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 O" t9 o8 F9 c3 W5 ^/ `
- B/ q1 S- x! i& v- g+ L( a4 ? if(pshreRAM->packet_cout != count_copy)& v# H' h6 o. d! G6 |
{
j3 @0 ~2 a% v: N printf("a is %d\n", pshreRAM->a);+ N8 E! v- o6 n1 L
printf("b is %d\n", pshreRAM->b);, i. T) C9 J# s
printf("count is %d\n", pshreRAM->packet_cout);
+ n# `, {% |5 m6 v7 M1 Y% e' e5 v count_copy = pshreRAM->packet_cout;
5 d: K4 ^ _& ?+ j" ~ }7 l) r- _* @+ M! a P
else
7 H( L; n4 `8 } {
/ A) O" M6 s$ h! A1 \ printf("No effective message!\n");- w: W! Q$ m; `/ i" f+ J0 w U+ ]
}. w; S$ R" c+ H( Q; \, U S
}
8 X, V0 i' ^. b' D) S3 l8 v% X! N$ _' n8 \; f$ P8 V, E3 m) d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& U( m1 X6 `" }$ M1 I
( i" }0 |: N# ~7 O2 [$ @
1 r7 A6 b1 H( b; f4 I4 V
- U8 {+ }: x3 j% a3 U6 [
$ i' v; {' a% p, r) w |
|