|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* L3 z! M1 |1 D% Q& j8 v9 y" X$ w7 j* K
) _3 Z( y* H, y3 p, KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 ^1 _4 g* `2 _6 N#include <unistd.h>
: X+ K* c1 m% L- ^; @! L1 r' b#include <sys/mman.h>0 \# c" V) f k3 X1 k
#include <sys/types.h>
4 t5 T% L4 l2 l#include <fcntl.h>
, Y, n, w; W4 ?( E! N# I4 C- x2 M7 \7 S5 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 O. T, n0 y, k2 T4 f m9 R3 w' l5 P8 Z& ]/ C. a' Z
typedef struct/ e6 y# \2 m& v
{7 s: V) K/ Y6 X) w1 _
unsigned int a;
: R1 s F& M3 q5 o4 q2 J unsigned int b;, W+ p2 s! N. |0 ?5 ~3 ^1 g2 ~
unsigned int packet_cout;% O+ H2 z, f% @; g, `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. I( v) g5 I' U2 K; Q$ q
& y4 ?% u3 f/ x6 m# Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 ~8 R ^; a D4 q
unsigned int count_copy = 0;7 F* g) _: o1 K1 ^ c
+ x4 i' p6 A$ ~+ a* {7 N' B) h( e
- ~5 k/ ]6 l5 v+ ]. rint main()
" J7 _1 q3 L8 r4 P{3 X' P/ m6 F$ q7 N0 g$ b
pRX_MSG_PROTOCOL pshreRAM = NULL;
' P7 `0 z+ q" ]+ U+ @6 O pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! s# ^! U5 ^+ d9 h9 \
/ T5 M1 _6 g P1 _ while(1)' F- p9 Z/ [" t8 I- O: {
{# U$ f& p- |3 T6 w$ w6 r
read_MSG_buffer(pshreRAM);
4 v0 N% n& r/ ?0 B; { }
" ^6 @# @$ u# i* [8 [: m3 m}
9 u' b9 y9 @5 h) y {$ J4 i/ W
& M/ e; `0 q" Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! H0 q8 p/ v. |0 K: h! C% [
{/ R- U. `" d; K" C& e; u" V
RX_MSG_PROTOCOL buf;- S9 V" C( T- _1 h- U
" r- I3 p* q+ w1 P. W buf.a = pshreRAM->a;
' ?( K2 Y1 B2 O" Z, y buf.b = pshreRAM->b;5 V* }$ B$ F% e) C! l
buf.packet_cout = pshreRAM->packet_cout;
1 _. j2 ^, ~: C2 a O, Y3 \ - ]' W8 X+ q2 x) A3 ~1 A. B
if(buf.packet_cout != count_copy)
9 Q x8 [) V+ q9 ^* W. Z$ n {
: w) u5 ?, q7 ^2 @ printf("a is %d\n", buf.a);' c$ L# `$ R6 r) Y V+ ^
printf("b is %d\n", buf.b);; t5 G3 o7 l6 s% B& C9 e& i
printf("count is %d\n", buf.packet_cout);& m( Z6 L1 ?" S0 T4 v
count_copy = buf.packet_cout;
1 m- b Z0 [$ w, u, p% ?- P8 x \0 ] }
" k. v6 \+ M& W1 ?/ E- ?. R else' S2 {4 T+ T$ D# s
{& Z. b# F$ e" R: i! ]. u
printf("No effective message!");) x; V, \ t! ~# s- L
}9 H' { q q, K0 N# U
}! U; u; t- @0 ~8 c
7 `. X2 r7 T$ k& l0 X# t* a( i7 F" k
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% s0 |0 F: U i+ B/ {使用下面代码,对内存使用了mmap函数后:
( N. @1 Q: ~/ } I- T#include <stdio.h>
( ?" k7 ]2 R: B" y7 M9 A: C#include <unistd.h>
/ ?* Z+ ]3 {) H% M1 C; z$ C#include <sys/mman.h>
5 v4 Y. K5 A. w& x/ {4 Y4 a8 P# i#include <sys/types.h>
: u) `) K& b: G0 L#include <fcntl.h>, X2 f+ B; I& [$ J; a
/ E m6 Q) d) [/ G
#define SHAER_RAM_BASE_ADDR (0x80000000)
- _# w& G( J, o#define SHAER_RAM_SIZE (0x20000) + x( ]7 a8 }7 U/ O
9 p9 k& M& B, }: A. }5 e: y: Utypedef struct
. I2 o) J; m7 m8 `{5 E/ r$ g/ e1 A. F
unsigned int a;
" R8 C# }8 y/ n* X* z. X unsigned int b;7 Y( m* D A' ^& p8 c! W
unsigned int packet_cout;
3 `5 C+ {& U+ V0 y8 ]; f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, q0 l+ m$ Y+ @8 l; e1 i1 A1 J. }$ e9 N, K& [3 Q2 F
void read_MSG_buffer(int *baseaddr);
0 P Y3 U, N# X8 u% G0 I- O0 funsigned int count_copy = 0;
9 F' @1 B' j+ V7 a0 ^2 r
q# T# r( g: Z, [, h/ ~int main()8 [: Q8 I4 R g6 Q2 t
{
7 D, B: t4 g1 g0 Q9 U9 G! F+ Y int fd;
- G7 i! R+ d( W' A% y; h int *mem = NULL;
/ V1 r/ F+ C' ?/ @- a& o
2 D) L+ `; N1 O. s: a if((fd = open("/dev/mem", O_RDWR)) <0)
0 P/ ]# p% Q/ k {+ q0 n# Q @1 p/ x
perror("open error");$ w1 h% m$ g% [) U" u* J
return -1;% R; Y; p& O% Y6 V
}
8 s; n/ F( d- B, h " X) M0 b7 y5 _& X& o8 j4 Z5 Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. f* ]4 w: V( @8 ~* o; Y$ K
* W$ s- n9 G0 E5 I while(1) X( p0 S! d# ~; w) Y8 ^- q2 ~
{
. P7 G7 t% M5 p" J+ I& O! r read_MSG_buffer(mem);
, G! L8 Y0 ]( v4 U) Y0 y }
9 b+ Q- a3 x- h5 J}
0 Q4 X" V7 s. ^1 `8 s5 X& H: B
5 e a4 i( e( Z$ @( E8 z6 P9 ~void read_MSG_buffer(int *baseaddr)
: H; e5 h7 ]0 B{" v6 ?; o$ w o, N% K6 c
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 R" K7 [7 M; M( ~; f6 o: x* D2 u& g1 Z8 @. `8 O$ i& G8 O: o; B s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- e0 M: G# p3 g0 ?& v7 x& ?( I9 U
2 B2 N% @( F% v; C l( } if(pshreRAM->packet_cout != count_copy)
; R, P! @% R2 q' R {4 B n* P% f8 B0 v" f6 c. v* w/ |
printf("a is %d\n", pshreRAM->a);
+ H; E+ _' S1 G: M) f7 H3 N: c: N9 [ printf("b is %d\n", pshreRAM->b);% n2 ?7 C" O7 U O9 @3 _
printf("count is %d\n", pshreRAM->packet_cout);& ]* ^/ W1 r a7 x2 X, A% V: S
count_copy = pshreRAM->packet_cout;* b4 F* a* y& G! S9 M7 j$ L& l
}
( U. x4 {/ ? Z3 C3 s) f7 b0 Z+ V" f1 z else4 z; r x) `' L7 \' h
{
- f* Y% I/ K: Y printf("No effective message!\n");
! ]2 M# { o9 z3 _+ q }
& c8 v: r" {+ ?; \+ ]! k}
& v1 i$ ?& G7 ^7 `5 W" U# x# n4 T- [: j& F
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 _: _# ]; E" }# b8 ~& j
3 j" I& ]% k; Q* u$ K" P/ m& U) R6 ~2 Z4 V* F& G& N# r5 o8 Q
# {7 @+ N7 Q6 K2 n' \' `+ @
" V$ k" r# [% k* v: u |
|