|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& V: c( }5 `& J( A5 o( }4 j) \6 W9 S; c ~7 p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. c0 V( L# A; @; w
#include <unistd.h>
; e' b. d( e8 w2 Z7 T; R/ O#include <sys/mman.h>
6 U8 s9 p: a. f2 b9 L% o5 }1 z#include <sys/types.h>$ ?& I& s6 ?8 |$ f& | N- s1 @+ [; {
#include <fcntl.h>
; {, a& z& G! _& U: O- k: D! J+ S* q5 H
#define SHAER_RAM_BASE_ADDR (0x80000000) . \+ K) l& O- [
G" G! \, D& j
typedef struct
: z4 K! j, L' ]) I& H' Q+ u/ X0 g" N+ A{% G' J, P# s# P& M+ O9 r
unsigned int a;
" y3 ]. ]. F: X5 X unsigned int b;
# L) f: z, g4 T7 M* k9 \" Q7 d unsigned int packet_cout;
% w r, D& C& W1 L0 G* @2 [4 \5 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% n7 Y2 F S" N" ^% ~) m! t. [9 k
, [# f) n7 T8 l6 ]/ u1 k3 V9 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- q' t) j& y# G8 c
unsigned int count_copy = 0;/ M Z, E6 Q0 e, r0 x4 u8 X
- S; G+ e$ f W' Y. F) j- z3 }% r
, P; X; ?: h2 yint main()
! Z! z% X8 C; u5 P# X. @{4 e& ~ ~$ t9 n8 y$ S
pRX_MSG_PROTOCOL pshreRAM = NULL;' O" s4 k5 @6 {4 c# r
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 _, O/ e% s3 {6 D1 [
$ [4 V& W7 a+ }5 w: d1 o while(1)1 i( F* m- G* c% V0 X
{
8 j2 v0 y, o5 u& `: s: S read_MSG_buffer(pshreRAM);
, p, U" w2 I2 H1 R2 y } 5 I+ B5 D; p3 v5 G" U' z1 k+ x
}
& Q6 X6 h% D5 y- {
& a, |9 L! n/ r: n$ |/ nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); L$ a4 I5 H5 v4 T: R Z
{
; m5 r) _0 T8 T! N' | RX_MSG_PROTOCOL buf;1 y$ ~. o9 X8 @8 w
7 ?; k% N* x, v/ r# W
buf.a = pshreRAM->a;
0 @* O8 Z( W+ \- Q' A buf.b = pshreRAM->b;; e# G2 _6 {) l- o8 y" B# a
buf.packet_cout = pshreRAM->packet_cout;
% ]0 R- N" Q) S' X Q5 v+ u% e: T' |6 ~! C
if(buf.packet_cout != count_copy)- F- b \) d e. u
{
; X+ O# Q! J9 i& r printf("a is %d\n", buf.a);: p& @; f) b- t$ I7 [, h
printf("b is %d\n", buf.b);/ i5 e' {/ X2 y/ {( {. s) a% D* p
printf("count is %d\n", buf.packet_cout);
( l, ?: K3 r9 l6 B count_copy = buf.packet_cout;
8 o- O' b( n0 q! n2 ~& m2 V3 d/ @ }: Z( e7 ^2 c) h! V" X
else
# F: v! E: e; n, s5 ?1 z6 v. { {% L6 d3 d2 C/ r; _" m
printf("No effective message!");
% e! w* F( J- A# Y, F C }
: K& X0 ^0 {; O! }: M}
9 ~9 J; I4 h7 l+ H; ^9 C. \9 j( c3 E* k
, m4 ~2 A) f5 U0 F5 z0 h6 z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% h6 x" K2 U" L, p* w/ [8 w使用下面代码,对内存使用了mmap函数后:
6 P! S$ g! ~1 m" B' T#include <stdio.h>
1 z. e- U! Y7 V#include <unistd.h>
7 T# Q0 F* r& X/ X+ {#include <sys/mman.h>
/ L. W: l$ j* E5 G#include <sys/types.h>
$ j) [6 K; v6 D/ I2 y) L#include <fcntl.h>0 I1 O# F* ^: }; j' N0 S
1 f2 g b. u: H6 ]6 X#define SHAER_RAM_BASE_ADDR (0x80000000)) Q2 T$ X5 O4 y8 r
#define SHAER_RAM_SIZE (0x20000)
! \6 z( O7 K% `! f. ?: e8 q/ v* A5 Q: {6 P7 x8 r9 T
typedef struct- |* |) z6 h! E* `( \
{
9 M( G- K/ T/ C% t* P unsigned int a;
4 l; T5 \2 L# a( Z+ D* E- b: y unsigned int b;' |3 t- `9 Q9 o! T
unsigned int packet_cout;' Q% ^0 s. B$ t% t" {+ B+ c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
{: T# u9 d3 z r2 I* L- j" h* q. U4 P) @, _5 t
void read_MSG_buffer(int *baseaddr);6 N, [ O s7 S8 g( N3 j
unsigned int count_copy = 0;8 k# T- G/ w7 _; d8 l9 R
$ X* F$ y. F# P$ }+ o' V
int main()8 \2 t8 m+ @5 D6 r1 K, R. e$ o
{
3 K- ?! T6 g+ ~0 e& L) {! ?( | int fd;
3 Z6 d* W0 }! C5 B" \ int *mem = NULL;
& z: f* m4 L3 U. |: r. h
8 c# `+ ]) _/ j" _ i& f if((fd = open("/dev/mem", O_RDWR)) <0)
6 {+ z4 D- P' k7 U! G5 A" g {
: }( V! N J) E perror("open error");
9 v b$ T" ]5 n3 ~/ M" q& | return -1;
! ~6 U+ J5 M2 `9 d( S+ [5 i }2 X- G) Y. C7 `4 r. d# j
( }4 G. y5 x$ u! g8 ^4 j2 J# Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 `; I7 d) C- q. q# e
, U4 I9 {# Y* ~1 @1 o& A while(1)
6 E4 |: b" X7 M, K5 u3 V {
# j" c* i; g# `. ^4 L& ?0 o read_MSG_buffer(mem); J1 L; Z& C3 _- g% @: }
}
* h4 k% {% i( B. C2 a}
0 N+ I y: W: K& u+ o6 {1 }9 @7 | L4 @
void read_MSG_buffer(int *baseaddr)
4 f5 ~( d) o# e4 a# B{
: F+ D, D6 o. W, h: W# h pRX_MSG_PROTOCOL pshreRAM = NULL;
9 } z4 B. E- p }* N' E& `
3 o3 w$ a+ l& O% N pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 W; c/ e% O6 `3 H
9 Q. C6 ?- j8 D if(pshreRAM->packet_cout != count_copy)* |, Z6 Z) @$ i$ ]' r& k
{
( J0 A; k; ^) d- }& \; k3 R printf("a is %d\n", pshreRAM->a);
. g$ ^# j- P% \8 V printf("b is %d\n", pshreRAM->b);, Q' m9 T* a* C% ]
printf("count is %d\n", pshreRAM->packet_cout);' H' f2 @8 E% A$ g0 M
count_copy = pshreRAM->packet_cout;$ x I! o, z% S/ ]
}
0 w% g6 J& h3 y% T8 O else% ~/ g) o: {. ~7 Q
{( |( k9 a1 Y' w3 }
printf("No effective message!\n");' M( A$ V$ Z; {2 N" `% z2 @3 b
}
# D( v3 r& Z* R* Q$ q% H3 k}
" V5 N4 c: X* o! R! u; Q$ _5 ?9 A& k9 h# o0 \6 t: Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( j7 ~( }# S) ]8 |; W
) N: P& j v0 {' a9 E0 X) L' X% }4 K
/ R. y) U" W, P1 r5 v- ~" B
9 b/ g& _3 A' _, W& Y, @ |
|