|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # @, a5 @( n. _: @4 p% k
# I) _4 L4 B3 BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' k. T4 b9 T0 Z- m4 g4 G3 E% l( i( `
#include <unistd.h>
$ \& \- A0 L# H: z$ G#include <sys/mman.h>: J G1 Q- W) Z- s) e: k0 s
#include <sys/types.h>$ P! m! m6 ]% E7 W2 l
#include <fcntl.h>
/ @8 ~* C7 \/ b5 c0 T
. q# y0 p5 [/ a3 v3 \& P#define SHAER_RAM_BASE_ADDR (0x80000000) , E8 K( w7 ]8 [9 ^8 @$ S
' ]7 T+ E" D+ v1 z1 Otypedef struct
% W) R% K2 _' ~5 x7 n{
+ K( {) Y% t# g8 W5 J$ ] unsigned int a;
9 G( K" B2 r0 {- v- a0 | unsigned int b;
5 i' z: P' q2 } unsigned int packet_cout;
2 @: R9 z! w2 a6 z& o) o8 K' k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 n5 W$ n! S H$ b$ i) O' W3 b# f' r$ `8 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# M# Y+ J% t0 l
unsigned int count_copy = 0;# Z8 n6 v# a5 L Q' ?( }. v# k
; W: \7 C2 x1 {3 K* |* Z. s. n$ A7 s2 E! @0 P
int main()
' E0 T, ~' Z0 p c' w) x; b{
' b+ }$ v; p: e6 W pRX_MSG_PROTOCOL pshreRAM = NULL;8 Z) O' j9 M# L! J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; z) M( a& D0 W9 ]9 m' w
3 C8 I: ^* |/ h" H2 { while(1)
; j, \6 S8 n( [% z! R8 |4 Z { ]1 i1 H3 [4 Z* n
read_MSG_buffer(pshreRAM);
" a% J) Y3 P5 A* w3 M* ?6 @3 L' G! j: _ } 3 X8 K# U# s" |% U, c2 S2 {- _2 j' g9 c
}
( U/ f- w' f Y+ i: ~
8 P. r' I. z% w. R' Z; Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 P" j) [2 X5 h# g{3 g& y/ G% B4 q+ _- v
RX_MSG_PROTOCOL buf;
* h. q, ^" f- S; n0 M
1 K+ F$ P4 a. b, x( v) L1 D buf.a = pshreRAM->a;
% s/ T5 n$ a- Z7 Z9 R buf.b = pshreRAM->b;$ S: \+ e7 j! D3 z: f/ i
buf.packet_cout = pshreRAM->packet_cout;' R2 }8 R m: C9 L7 s% B
; J" e# ^8 z% i1 V
if(buf.packet_cout != count_copy)
, U% ]1 G) H1 h# b {) Z7 ]2 C6 T4 w1 s$ W. a7 f m( s
printf("a is %d\n", buf.a);, x, v* s! v5 z& j1 o* b5 Q: i
printf("b is %d\n", buf.b);# w4 x3 m P% i( _- q9 i4 U# O
printf("count is %d\n", buf.packet_cout);2 `8 R6 n$ w; c% M. R2 j
count_copy = buf.packet_cout;
. l, M4 p6 f/ a1 B }
2 Z4 I. `; V7 e, v7 ^+ v7 q else2 b0 O% c9 K# U) d4 @! ?$ T
{: Q- q, i- ~2 `7 y8 I
printf("No effective message!");
" k( R; Z3 {: l: p! O2 u, {! V0 k8 q2 C }- O; ?& k* s2 N
}8 y" V5 T4 c3 ]+ J* l* e
2 T5 r& u( [/ Z0 J7 @2 n7 B! }1 ]* ~6 i! S/ B3 W7 c [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 P' @5 z; A# d, r5 {
使用下面代码,对内存使用了mmap函数后:3 ]) k& c |) l. B
#include <stdio.h>" b, ?+ r. e% u4 b2 s
#include <unistd.h>
$ C9 c! R2 P! L% B Y* e1 |#include <sys/mman.h>- W( \" Z, q0 V' _
#include <sys/types.h>- X( c: n' s% V3 N: _
#include <fcntl.h>
9 p7 u- `+ h; K; o; ^# y8 W9 W5 A/ E' Q9 p/ a+ ~% ?
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ Q/ v+ ]( W1 }( v* }& w4 d w#define SHAER_RAM_SIZE (0x20000) 1 d5 v: S. x% E3 W; _! ? u ?/ B" G
9 W3 K7 [ p3 j/ ^6 p5 y; k( \
typedef struct
+ F+ r- q* J# a$ ?$ L3 T{
% D. K0 e$ Z* P3 c& ? unsigned int a;
8 a ?+ u# v! t5 c1 A, h unsigned int b;7 e$ \( H/ d: L/ c+ g- Y( G
unsigned int packet_cout;
/ f1 ]0 ~* a/ X; E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. l4 |3 K; R: K4 J( \' V Y1 H# \. _/ m+ z) c2 G6 v0 u
void read_MSG_buffer(int *baseaddr);) e. E6 \3 n8 G0 D& O3 M( S0 L
unsigned int count_copy = 0;9 \/ U$ t/ o5 ~5 b: d/ n7 k1 X
- n$ I5 w5 H: m' g; k& lint main()2 |- s' |8 ]! |8 C+ e0 P/ X
{( c* ?" t- G' @
int fd;# N' E2 a& w- z, n4 W
int *mem = NULL;. |% }4 B: Q! Q' [
, ~! \* k- x T, O
if((fd = open("/dev/mem", O_RDWR)) <0)* v4 r& ?( G) A% l% i) Y' I+ X- t
{: z% w1 ?& X- U3 U& J2 E: z. ~
perror("open error");
% P9 Y7 d$ Z, T7 I7 ^$ w% J return -1;/ m8 s( K) O9 Y
}4 T; h1 C, H6 r. u! T
: n# h( `! L3 q1 U" C* ~4 T. h. h
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); H# t. m& r* r
* m+ q- @' j$ [6 J( z- Q
while(1)
! O" @ E0 C3 ?) A9 P# t6 E {
8 w" x: A5 e" V0 i" c1 q/ V read_MSG_buffer(mem);" C& D/ c& e9 H" J; z: x; C9 v2 F
} % {8 c7 `3 X1 A. ^7 E* C
}8 ^$ x$ ^5 a3 l5 g
8 z# o2 @1 L7 ?: f
void read_MSG_buffer(int *baseaddr)7 U3 f: E5 i6 @" r3 `
{* y: f, y0 L; |* w6 g: ^' l
pRX_MSG_PROTOCOL pshreRAM = NULL;! ?2 p2 t G3 m$ f3 f/ g
9 B3 Y: V0 B2 S) g: q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 v# q3 z3 q3 K( N7 }( ^& d" @' u7 h3 {8 F$ l3 h
if(pshreRAM->packet_cout != count_copy)% u- ^; V ]7 H, |
{/ r: }# H6 A; P2 ]
printf("a is %d\n", pshreRAM->a);' P {, Z* t/ B2 T9 l6 z0 V+ b
printf("b is %d\n", pshreRAM->b);: z% e# k, p$ S" I5 V5 S N
printf("count is %d\n", pshreRAM->packet_cout); N$ D; m! L3 b4 T' {/ j/ L
count_copy = pshreRAM->packet_cout;1 J- G9 B. e. g. o: n
}3 a. Y8 a* Q0 l
else# k3 y# N5 X1 H1 ~& u' U
{
$ X$ j. e( ?7 b/ P printf("No effective message!\n");
9 \6 j4 o% u) X4 W. i7 X }
6 j$ G B- |5 }# t# Z/ P- M1 ~$ i0 d}! c: z% d3 ]3 m; w
: L4 o* W4 T6 v$ q1 s/ h M5 L0 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% a; w0 f- F2 W' y' e/ @
- g1 g' q m$ ?7 m1 L! H0 [! Z/ H7 o+ u" j+ y; |% Z" o! y$ I
: M+ e+ v/ B' Q* Z: O& n
- E5 g. q4 n \7 A' W |
|