|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % D( ?/ T# W6 I) g
/ e! h" T. [) Y8 q- D7 T1 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
l, J* A$ N1 Z7 H' b#include <unistd.h>0 d9 H( M/ D( K: G: k0 e) V$ \
#include <sys/mman.h>
4 q# o. W8 {% N4 n#include <sys/types.h>
* q. z& X7 k; ~#include <fcntl.h>
& D$ V }6 P8 C: R/ ~- X/ f3 J2 \
8 q# m' A- X, N0 i( |: E7 f#define SHAER_RAM_BASE_ADDR (0x80000000) , H7 z& H7 ^& k( x1 \4 r: T' S
1 @4 o* r7 f& |4 v6 L# c$ M6 Gtypedef struct
% L/ l3 Y9 r$ K, @4 w' d{
) v+ r! k; Z) t3 q, n! Y unsigned int a;
4 e8 G+ t5 Q9 E9 _1 g unsigned int b;* P9 S/ `* ]$ r
unsigned int packet_cout;
/ J. m% Y6 P# K1 q- ]# F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% o. r" J2 C2 \6 ], W
" n& y" p( N8 c: {# p6 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 |+ C2 M' d5 r7 ?1 j# H/ |0 tunsigned int count_copy = 0;" L0 ^. P5 u* G' C: V
- _7 B( y8 ?. N' l1 Q/ C$ w/ p* A
9 [' z3 T3 [ P) nint main()
, h. o, N1 Z" d+ q: y{+ D! W5 f1 ~8 O v
pRX_MSG_PROTOCOL pshreRAM = NULL;
# @+ J1 ~+ |. Y% G5 I2 [. | pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. y8 b v* ~3 p# q5 g u+ e N( q% x! j; |( {, b
while(1)$ b& m3 T! E% M+ {2 n
{
% W" e; R; }2 E8 _ read_MSG_buffer(pshreRAM);& n8 Y$ k# i3 N) B' q
}
7 e5 I+ o3 S2 Y. ^7 n}6 X- L$ z0 o7 i
8 v4 f7 i( b1 ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 J0 T' ?' f3 N# T1 t# L3 ]
{+ d" G, b( v$ z# g2 ?" X
RX_MSG_PROTOCOL buf;% p2 N7 r6 q$ y+ I
& b3 J6 [7 n: y# b( O buf.a = pshreRAM->a;5 C6 u# w1 l5 `' m, D' l! h: W' t
buf.b = pshreRAM->b;0 `; f }: a! Q) ?( p" |$ |
buf.packet_cout = pshreRAM->packet_cout;. J" l! D( O8 G8 ~
) `: ~+ A8 b( {- U- j6 i3 B4 T
if(buf.packet_cout != count_copy)
3 |( |* v9 O- ^. B- j {
; v, G4 C. f V, @ {1 e( \ printf("a is %d\n", buf.a);* z3 Z5 a$ p$ E; q9 V
printf("b is %d\n", buf.b);2 ]$ x. p' z/ [ i
printf("count is %d\n", buf.packet_cout);
4 A1 J) w/ K7 f: A7 u count_copy = buf.packet_cout;+ }$ R" w& G5 o
}
+ Z: z; }8 t- P7 e0 d+ i9 ` else+ ^- @( \) ~; _" p: g
{! S" r3 n$ {- U6 n! U$ b2 C
printf("No effective message!");5 g# W" h; Y1 d! h) q
}
$ ]) O! n+ R% O" D}
/ G- J3 M3 f! J- w% p) \8 D4 ]( B0 z( z; C
) U2 C) D/ J3 E/ H# B; P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; c$ k' c% W0 g) Q, X
使用下面代码,对内存使用了mmap函数后:
( W8 W6 T' M* M( z; a* Z" i* A#include <stdio.h>
% u8 X4 X; [+ U#include <unistd.h>8 B$ }6 L* R) e5 e, H( ~* ?! \ c
#include <sys/mman.h>
- b) I7 R% `) m8 M* ~ k#include <sys/types.h>" w' ^! H) c5 X! \" C
#include <fcntl.h>0 H! [" t, `3 x1 u0 b* \+ [5 l
: j2 E) i, A9 j#define SHAER_RAM_BASE_ADDR (0x80000000)- j4 T1 I- |# g. o9 p* Z
#define SHAER_RAM_SIZE (0x20000)
5 D9 Q8 |+ d+ L6 W
' \" n [3 p4 _ g& F( ?- |typedef struct
. N5 V* {2 V* w. W" ]{
" r5 A8 `6 t! i2 | unsigned int a;; U' W- `* X; F5 C$ A1 z
unsigned int b;* x. J W- h, b+ N
unsigned int packet_cout;
% ^" r! B# D; v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 W; \2 Q! f( R6 D6 C8 Q% T: O. U _9 \! [7 Y1 t
void read_MSG_buffer(int *baseaddr);
; t; Q( v# B# o: z5 Uunsigned int count_copy = 0;
. D9 b; q7 p! W2 C
5 X9 W3 t6 w8 F3 D9 J7 u) W' t; }int main(), x0 U) j" p: w3 W# Q1 t
{* q5 Q+ D" v }1 ^. |, q: w& n
int fd;
- ~( D, o& L" A c int *mem = NULL;
) d7 j9 z( _/ \& W! g( \' K6 x) l
if((fd = open("/dev/mem", O_RDWR)) <0)
w# b4 y) Z8 Y _0 J2 L {6 O3 d- {5 G! W3 e! X. \0 |
perror("open error");" [0 _0 k. [* I* d+ ^! i9 g" K
return -1;# W3 n) r% b, ^: x. f
}
" A8 B8 C* f" l6 r4 @* @ * `. }' {$ n. F1 \* S, o
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, t7 ?! M* w( }" Q/ V# @8 Q! ]. t; `, p6 e9 s) c$ K
while(1)+ N7 M/ `8 a: M, @
{
- G. k5 }- `5 Z! Q read_MSG_buffer(mem);
* B& Q r, I3 o } ! D( X I9 G! a% |' D, W& _
}
" K f" y/ H; q/ [
# H5 D2 v% W4 x) ~void read_MSG_buffer(int *baseaddr)+ L5 P- l w8 Z3 i ]! I& S
{
" t" S- d) o E4 t4 C# S; L2 y pRX_MSG_PROTOCOL pshreRAM = NULL;# I* }& d# |! t! Y1 I
0 k) c F2 N1 z6 a7 D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( M. l7 w' r8 r/ t
- p! b! q9 D1 L2 [2 R
if(pshreRAM->packet_cout != count_copy)" } x6 {) [+ E+ t2 g! c1 p5 p/ k
{
# l1 m9 j: g8 ]/ P* C5 I7 @ printf("a is %d\n", pshreRAM->a);
2 c% M. ]' T) z3 W5 C printf("b is %d\n", pshreRAM->b);: o* n" n3 d1 H
printf("count is %d\n", pshreRAM->packet_cout);
* E! G) ^( l' B3 { count_copy = pshreRAM->packet_cout;
/ G& E) o' x1 H* D }/ F! I* U7 P: {7 w
else1 x2 M* J2 w0 k' a3 r- q$ t& |
{
- @$ B' A+ [3 Q$ q" _" W printf("No effective message!\n");: n4 J7 P7 b, c# w- f6 S
}
- J$ x q7 b* P' T& ~7 H}
- M# I9 Z0 h- d' f0 U) E& X' G
2 r1 x' x: Z, @) U6 u2 r; Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* B) O& I* N1 j- N% r) X' e: j) ~
( G% C' s' v+ K8 c5 V' _& d t% j+ y, `" J$ i
7 L- _8 J3 A( l# \! M: F1 [( F7 C* f/ |9 N% m% S" o9 w
|
|