|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 u6 B; z4 Q# ]1 P* s6 s
3 ?6 m- N9 ~6 E5 iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- g. g) F+ ]4 i) |#include <unistd.h>7 {7 H& T1 f) n8 h* H# S
#include <sys/mman.h>
* V k) d8 z9 T$ [ _' Z#include <sys/types.h>4 Q; d% ~% s$ Z- K# B
#include <fcntl.h>
4 F6 b+ _& k# v( P$ u4 X& L! _- ?& l, o
#define SHAER_RAM_BASE_ADDR (0x80000000) * `: f0 Z9 k+ t
7 E+ q* x3 E2 A# Y4 W
typedef struct; p5 [2 y3 ]7 \% a/ Q, Z
{
* ]% z: E) _/ O9 |/ y8 h: r a8 p. c unsigned int a;
5 j, f% P' m; W unsigned int b;
9 V! W$ Z* {# z' w( }* v unsigned int packet_cout;0 p- J5 B4 [1 q+ R+ d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 J8 @+ q+ \" c
# Y! @ @( {" g- hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; j5 D7 I9 f/ M6 O6 F4 cunsigned int count_copy = 0;1 w) X" x) p @ S
7 |; M3 ]! u0 c3 ?# q `& F' M2 o
int main()/ Z& c4 Y0 X; w# U8 C
{
) ], |; I- P" g pRX_MSG_PROTOCOL pshreRAM = NULL;
5 _4 W$ M7 s% m8 g1 L! @* }" m pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 J6 p8 F" f; \/ \% [( `( J' e
, D( D9 x+ {- H. P. D% x& O while(1)4 j" {' z/ P( h* M( h
{
' e5 W" z: s3 d read_MSG_buffer(pshreRAM);( [! O9 M% H. O2 H$ i; \2 }
}
* g% ]6 Z/ r' _6 N7 p}; P) ` w4 y- ^& ?3 j3 _8 F- u
, C2 H: n4 y( w- o+ u/ k. Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) p8 `) G- W5 y& I: g
{
4 k" z. k) W0 k( M& J+ { RX_MSG_PROTOCOL buf;
. w; ~, J# ^, A) K2 c2 U' F
- ?: Z& i! H) e; ^3 R buf.a = pshreRAM->a;6 F1 N& n P8 w& h
buf.b = pshreRAM->b;
) ^0 C& q( F5 o2 a: H1 D6 H; C buf.packet_cout = pshreRAM->packet_cout;
' m# F1 d M0 ]: W( ~. \) A
6 |& _4 G3 k% U, r c5 B8 E if(buf.packet_cout != count_copy)
/ x4 ^( S. }8 x3 F1 r/ |2 f# V {, d; x9 C/ D4 _" B7 v
printf("a is %d\n", buf.a);9 I! |5 v3 }# e* n0 E/ C; Y- O9 F
printf("b is %d\n", buf.b);
2 R. a$ V6 n4 _# e, z$ y/ L& \ printf("count is %d\n", buf.packet_cout);7 U8 M3 d1 F5 X& x* s+ L
count_copy = buf.packet_cout;
! R: A# T! ]7 A4 h! Y }* I6 l% t$ x9 }, a7 f3 Z Y8 x
else
' c5 K( H" }/ ?! J {
7 {7 @1 v+ D* q0 i e printf("No effective message!");) U. w. o3 F- M
}* u1 M/ |- Z" A1 n$ m
}: ?- ]3 d- ]% Y% L2 M- k' @/ Q
# |0 j* M5 J6 t, ^
. l* n6 q$ v3 j- p) d* ?& P5 n
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ S4 ?$ W# [. _: I' q4 a3 a使用下面代码,对内存使用了mmap函数后:6 h% E6 F: p( K, M' l
#include <stdio.h>) r; l7 X% n3 F5 F' R0 ?
#include <unistd.h>
( R8 y) e9 m ~- S! V#include <sys/mman.h>: J% @ X# y, @' }
#include <sys/types.h>: b6 o( H* z, n; w1 t! p& k
#include <fcntl.h>
! H# Y2 m. h$ {; E3 z
9 A0 `* W5 r; y) a#define SHAER_RAM_BASE_ADDR (0x80000000)
4 i( t/ Y* Y9 M/ `1 Q- q#define SHAER_RAM_SIZE (0x20000)
' \* p$ b- m) a8 t$ P' i4 L2 I. A$ O+ w
typedef struct
: `/ ?: W/ J- Q6 M{ H# w8 s# }2 o' n
unsigned int a;
7 H6 \5 L2 X6 ?* L# | unsigned int b; I, Q7 w0 G, `3 `& N; P: m1 v& M
unsigned int packet_cout;( K0 }% E" {: t5 V# k& U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 @1 L* o2 h6 B. g" [
" n2 y5 o% w( `2 q' g! {! _3 d
void read_MSG_buffer(int *baseaddr);
+ M) w- T2 x5 E2 e) aunsigned int count_copy = 0;
$ {7 g/ I5 s+ B1 @2 T' }
; n8 G. {" O8 e/ V+ Eint main()7 {/ P6 M6 N& q5 }' k& i
{9 K" F; x7 _' x2 ?5 }! ~0 C5 I
int fd;
7 h& j; n0 S$ e9 Q. W& n+ G int *mem = NULL;
2 H& P; @# c3 C0 I4 v% S) \9 z: E+ B' n1 O' g6 h* s6 W: s
if((fd = open("/dev/mem", O_RDWR)) <0)* S- O" D7 i2 U# d
{3 y& ^7 d- q" s- @! a9 u5 ]: `
perror("open error");4 m8 g$ f' S& x2 q1 R/ {( j
return -1;
5 {9 z6 ]2 O# ^0 U: z! C& A' X }
5 u( N l: L) i2 A
* |# F1 z4 y& M' B, h3 H mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 y; X7 ~2 J. B, \) [0 t1 h" V R H; \3 v$ M9 i" |. T
while(1)1 v5 B$ i) O+ c5 b# E
{
& a, e4 X9 J/ I' w read_MSG_buffer(mem);
* @) h9 V$ j) R8 L } ! l$ `2 {! T0 M
}
7 P B/ q' o8 Q5 s. X* k! _+ N
_$ [9 [* W$ R1 ~ Ivoid read_MSG_buffer(int *baseaddr)
, D/ u3 o0 N; A* v1 h: c7 x{+ ?$ L6 }; x+ [* K
pRX_MSG_PROTOCOL pshreRAM = NULL;
, N! q6 ^, P2 K# q: a' v
1 Q) q/ x% ~. A# S. N# p pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' _. x' k8 E3 ~8 |! X* S3 u, `6 z+ ?/ R
if(pshreRAM->packet_cout != count_copy)
: i; O* v! j4 | {2 P7 K7 _3 ]4 e. h: K, ?
printf("a is %d\n", pshreRAM->a);* @+ q0 A4 I- Y7 U7 j
printf("b is %d\n", pshreRAM->b);
7 r6 f3 h. a, X printf("count is %d\n", pshreRAM->packet_cout);8 R) d+ T: w8 B9 u5 T
count_copy = pshreRAM->packet_cout;
! X# }# h4 s y0 H6 E, w: J }
, Y9 q% R8 P+ A( ]2 {$ y else
! N; L/ `. q5 K3 d! R# @ {
$ K- {5 a7 U/ o5 M printf("No effective message!\n");3 \5 A7 s! R* H6 J" _
}/ T% v, y) I; I2 e( y! b$ z5 ?3 Q
}
& J, @# [2 A0 u2 n
8 `! l4 r, Y" A3 E7 a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ i* Y* N; D- q! Z6 A6 @
7 [! ?# z0 R& r; H- ?
( c% ?4 W$ ?/ R- f5 I& _6 D& O [; k) y% ^' a9 f$ f; S
$ N' L/ K* Z1 Q& C) R6 m/ K
|
|