|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 ^; L" ^, x$ _ z" h+ c. N
: m3 }- T# j) J. XOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 @" j2 P% ^& R* d# z#include <unistd.h>& m: u. v, R2 t9 k* N0 G; o
#include <sys/mman.h>" ?) @/ x) q/ L$ h- y
#include <sys/types.h>5 M2 d; J0 l, r( z- F3 v3 G; [
#include <fcntl.h>
$ ^- x# k& @" `4 f3 o/ s) b- n H9 F6 r- U
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 ]. ]# P6 C3 t, A0 M4 l
" ~9 w* _: x+ `5 ^! r; l2 Wtypedef struct
% M6 n* ]. E+ P, \; i{& ~. F B! ~! X% J
unsigned int a;
) T$ S, |& K5 D# k( P unsigned int b;
+ T, ]* F2 f% \- j& h unsigned int packet_cout;3 k8 i) H! n( b" L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) U- x; r- L' p: |$ `0 z! T$ _
; y& T- j+ Z/ V2 V+ ^8 V" n2 b2 S2 @- tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. S0 p/ r7 Z- ? {# y2 b; |unsigned int count_copy = 0;
3 }) t6 j: n% l& t# b* s9 P0 G* s* C& l" f3 s0 Z$ H& X/ d
+ _# Q0 ? }8 U1 a, \; wint main(); }2 G T# C" Z8 U' W3 C
{
% D* I6 N3 o) q( O k: z& E7 K pRX_MSG_PROTOCOL pshreRAM = NULL;
9 ~) d# @% _7 Y, g pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" T* }8 M$ @4 @( B4 [
$ x$ d6 D5 F8 N: } while(1)
/ D1 c D% k4 Z- R {5 Y( V' S& p$ z/ o8 r
read_MSG_buffer(pshreRAM);
1 |" m* B, J/ E4 f. q& r# _ }
( l% G( ~* l/ C# }; J9 j& _}
1 E+ q/ L0 g- Q1 W8 d* k
5 N- {4 ^5 b, `8 z8 _" O+ d5 L6 xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 b, W* b6 c. V I4 C- T{6 h& m5 X$ i- {) O% _) P5 i1 `, _
RX_MSG_PROTOCOL buf;8 V3 p w% ~# S+ D0 J
% L# H& R4 h+ x) S! A; Z% g% h
buf.a = pshreRAM->a;
& n; [7 D: h, I/ B2 h! m buf.b = pshreRAM->b;* C% G2 B# [% \. E5 D. D" x* t- J
buf.packet_cout = pshreRAM->packet_cout;9 }8 G; b9 [) p5 l" e- n+ H2 `
) H. y: l& j- X0 U6 n if(buf.packet_cout != count_copy)" A4 `9 k9 W' d! r0 D2 w# X5 }
{. v% p2 J* m! H: M* k4 ?
printf("a is %d\n", buf.a);/ s1 g+ m- V) J9 {/ Z
printf("b is %d\n", buf.b);8 `% Z; ^ M) l7 N% }0 R- u) h+ R. L+ U
printf("count is %d\n", buf.packet_cout);" \& V+ E- P- }) q$ k. ^
count_copy = buf.packet_cout;8 B( `4 @+ E& w2 i# P
}1 x3 V6 L j9 v) j9 g
else
+ b1 p2 a* n, a, L {) V {3 w% D* [6 g3 d9 n4 L+ f8 K
printf("No effective message!");: c' e% A9 i8 T! J6 U2 B. Q
}' Z4 M- m, S8 h0 h) v
}# r4 ?/ I8 z7 K1 r2 J9 m+ ?+ d
% {) E0 `/ }- z7 [) n
* r; `7 @/ v( q: O9 Z6 b% U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 Q/ _6 J" d* w; Q$ ]( |使用下面代码,对内存使用了mmap函数后:
& I+ N0 B& y" d#include <stdio.h> v# O9 n) l& m5 W* T$ @+ v
#include <unistd.h>5 G2 n( Q6 f! i
#include <sys/mman.h>
3 I* C s5 d/ @0 u#include <sys/types.h>& u: F6 s$ z, @! C+ R
#include <fcntl.h>
- {* F/ ]1 `) |! Y7 F$ V% Y0 s/ x
; S1 C$ I, c. [* q! V#define SHAER_RAM_BASE_ADDR (0x80000000)
$ z3 }+ R7 j/ ?& H8 `#define SHAER_RAM_SIZE (0x20000)
. z! g' F& s( P% L6 u ^ R7 F
2 n7 P4 ?$ i1 n) ctypedef struct
1 u7 o1 _1 \% p+ d{7 {% e& w* Z: W* u5 G
unsigned int a;
" B! {, M+ R7 W$ F unsigned int b;
1 x# u9 X8 f$ U- F6 c$ ] R% p unsigned int packet_cout;
2 j4 A5 H' Y/ c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ y$ S8 E5 q( Q2 K/ b1 F3 B
+ O- b/ ^0 ~! q+ U8 o1 pvoid read_MSG_buffer(int *baseaddr);. `6 j' ^0 O* b1 S' ~
unsigned int count_copy = 0;
0 M# j- ^) j0 W; S
% C: T2 v, w, ?8 G) I3 C9 u* {. yint main(): Y7 {) Q0 X. N/ r
{& d4 Z. x& E% Y. Y2 \- }; w8 v/ {
int fd;2 q/ ~+ `& p/ q2 [( O
int *mem = NULL;
. L: x; U- O- A k. n# d; [, q* \- U1 M1 r' x, k. C8 J ?
if((fd = open("/dev/mem", O_RDWR)) <0)6 N# ?0 Z9 j4 `
{# L( r: B1 y3 W% i1 s8 S
perror("open error");3 {8 S% A5 `5 o X; a. U/ h1 t" k
return -1;
& s5 b, R1 G1 @. n) D }+ p: l) e1 [6 Q) E6 K; d+ P* i
/ r# W: T' \8 h7 k4 |# A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 h9 Z! s& O6 w! C' c; I; [, w' O6 B+ |7 O
while(1)
! M, Y1 S' l5 y. x2 w4 R: j {9 \; G+ m3 J( j# k& M" {
read_MSG_buffer(mem);/ Q4 h: C- j8 D& d* t
} + D$ ?! z8 C3 _1 s! ]
}5 V8 P( l5 I: z! f5 w8 P$ k
# a! H5 m4 `9 i p0 b! N0 M( D
void read_MSG_buffer(int *baseaddr)
) K. K' l+ O( F7 Q* l{ R5 a2 F5 E; F4 o/ ]: o- {/ I
pRX_MSG_PROTOCOL pshreRAM = NULL;; I v, ^, i# Z! W2 n7 ?6 B) F5 Y- x' I
+ {3 L, H5 K m+ l/ n
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# G: F" T' K |$ ] q' L- R; o' m6 q
if(pshreRAM->packet_cout != count_copy)7 N! W: m4 ^/ q6 D F" R
{
, i/ T( J) X4 o1 |3 t9 g printf("a is %d\n", pshreRAM->a);4 M# H0 V4 c( Q" ?& ~9 r9 J
printf("b is %d\n", pshreRAM->b);
" I6 F1 O8 ]( X8 {2 n. \ printf("count is %d\n", pshreRAM->packet_cout);$ p- ]! p0 {6 }0 O
count_copy = pshreRAM->packet_cout;" e4 `2 a K+ q: r$ c9 f/ J
}
d: O4 z3 ]4 {$ b2 `1 X' c else! g' U$ F B, Z) M3 k
{
8 Z$ H- a r9 ^( u) Z printf("No effective message!\n");
6 B8 H& f( v- M }$ I) l( w* t; k5 @' `+ D
}6 c% X) M- N5 U7 M- w
) e' f) r* i) Q$ R; C8 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 a% J+ T" p" r2 I N' I) |; s: f1 z" |6 _
& C J3 j- m6 H/ g: X$ H" `0 `$ f# R+ ?7 F+ A: R5 o2 |; v
, I8 G. }9 h/ z% r. |% q1 |
|
|