|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# ]2 @0 u& j2 e) o3 I0 y. n. R+ H% @) z/ z2 P4 P( }. l" O7 u" A ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& f/ O! Q R5 d#include <unistd.h>
8 @7 Y, W1 l* Y; j#include <sys/mman.h>
4 g* p8 _" [- c# L' }" S f* G# p+ M#include <sys/types.h>
6 W; b/ ^, m( U. G% y; a0 v! _#include <fcntl.h>
6 ~) G1 Z3 J/ \0 X' @8 _) w2 v6 y5 {: Q' K+ l" x
#define SHAER_RAM_BASE_ADDR (0x80000000)
# ~2 S) K) h: C$ I: u* A! i
' E o( X/ a7 `" }: U7 o: w1 A0 Atypedef struct. h. u' d/ Z& l9 I
{
; @! I. q5 k2 I; I) J8 r5 x unsigned int a;
9 ^4 s: t; V" q# b unsigned int b;
% l. O" r* B& Z8 n. J5 g unsigned int packet_cout;
% v3 Y: }( J# I/ o4 n! S}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' c! f7 v* B" @2 o+ O; h4 s% x" V7 ?5 I& ?# z2 L$ [+ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 {% |3 z/ }3 U( J n# ]. U9 J+ ?' ounsigned int count_copy = 0;! z9 D7 }: q, O+ L* H
' G- e; F2 r Q8 m
8 m% u- E( W5 I1 E, Y& g2 i" Bint main()8 u$ F( `6 N4 G% L( Q- U: o, i
{9 y- Z" Q3 X |7 A
pRX_MSG_PROTOCOL pshreRAM = NULL;* {6 {# X- @6 ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) g; p. j e2 V0 Z1 g
& [' w4 I- {& }
while(1)
/ @4 y! }7 T6 }$ F( I0 r {
1 \* `' M. h7 U+ g: d2 J$ K read_MSG_buffer(pshreRAM);8 L3 F- P, q- D( t, u. c* m
} , }- x- x9 \# t, o
}
! X6 w; E z! c8 t9 S) z3 B! b) l1 d0 ^3 a, i# H9 C: W9 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 b) ?- d2 Z* o9 K4 N
{
7 `* R6 \( _0 B1 D/ ~, M RX_MSG_PROTOCOL buf;
& V% b+ A% D3 l( ? S ) m7 G$ o/ A7 M- V: N8 r) W$ G
buf.a = pshreRAM->a;: g- @, ^& `2 [8 u% L
buf.b = pshreRAM->b;
. v8 \/ l! S! d/ a* Y# z5 P buf.packet_cout = pshreRAM->packet_cout;% r( E+ Z* ^; O! ^9 o
z0 l7 t% O* j+ { if(buf.packet_cout != count_copy)
/ \# K) U j. L( D3 d8 m { {/ y2 P8 p* Y) F6 l5 D3 I1 I
printf("a is %d\n", buf.a);
. L! F) L: u6 n Z' ^8 K. k printf("b is %d\n", buf.b);6 _4 v# N& N9 L# J9 ?
printf("count is %d\n", buf.packet_cout);5 A7 h3 Q0 k0 l
count_copy = buf.packet_cout;% [3 J: B/ [ u V7 C
}
9 d# ~0 }6 e4 X- l else$ M1 Z; E1 I. H: Z) c7 C
{& B; G- h: c8 c+ k% G+ [2 J
printf("No effective message!");5 r f+ Z3 z7 c' T4 `
}1 S |( M( V Q$ T! b4 D
} ?1 x2 o' B% L+ y+ G
) _" b5 F7 x. f, B
5 e' h' H. M0 S' |4 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- B- h: u* m8 F4 m
使用下面代码,对内存使用了mmap函数后:
3 K/ P$ k' V- @2 S#include <stdio.h>
% @ j5 ]7 h1 l' @, l$ O#include <unistd.h>
( v s# K$ J) e- W2 U9 p/ Y' l* O8 O' l#include <sys/mman.h>" c/ Y) t1 {2 N" L
#include <sys/types.h>
. e* y$ s {9 m. u: k3 m#include <fcntl.h>
. u/ G" i& T) i9 N* V1 v4 y) U/ M( V% z
#define SHAER_RAM_BASE_ADDR (0x80000000)
! T& w8 M7 x9 k& r0 P) N! h1 Z#define SHAER_RAM_SIZE (0x20000)
* z% R2 t U* \$ c4 f
( T2 d' c7 Z" {9 A* G" Rtypedef struct) c# M* I4 H8 n2 c ]
{! W! ?0 m% a8 E. @
unsigned int a;
. f0 l* |* z1 x8 ~& a unsigned int b;
9 X% G( Y- u7 ^, ^4 U unsigned int packet_cout;8 K6 B# M5 `: B9 o0 ] [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 @! \ S7 \/ u% D9 N- E) ~3 z* s: |: n1 W% \1 j
void read_MSG_buffer(int *baseaddr);
* W, R7 z5 _; X5 ounsigned int count_copy = 0;
, M9 @5 g3 @0 c
y! t% T1 U D; v" \8 ]int main()
Q' N3 s" P) H' l9 e' S{1 v+ x# _$ i' K9 F" Z
int fd;6 A' H( z7 S! }; A
int *mem = NULL;+ A1 x% ~. j6 n" m- }4 S, g
8 x# C0 W3 H/ |3 Z if((fd = open("/dev/mem", O_RDWR)) <0)
, M# { F" e. c! g; ? {
2 e$ a6 l# r6 p/ | perror("open error");/ k8 j2 [$ o7 h1 \) @8 `' B& J, G
return -1;; r$ s8 I8 s. N7 Q5 J0 O
}
% I1 E& p" _. \7 x3 I' l5 ~ ) X @+ f6 h$ H3 `7 T- }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 F0 L8 N4 t6 ?
# g: b, }3 t% |. W6 O. H while(1)* W' x2 l- E/ I; A' }6 s
{
4 k- O; k" j, B* Y4 [ read_MSG_buffer(mem);) x% t5 Q" k4 b0 c2 N4 x2 Q+ U
} 3 b$ I+ G+ `! a& b
}* P+ R5 z3 ~. A/ z$ H
5 e& H/ D2 S% _) P2 P
void read_MSG_buffer(int *baseaddr)/ q6 \1 C) U7 B8 ~6 P! m5 W
{0 _ R3 T/ ?. O" k
pRX_MSG_PROTOCOL pshreRAM = NULL;8 ]& L: g- b% h- V, r( R U
4 ~8 d/ q9 h( | pshreRAM = (pRX_MSG_PROTOCOL)baseaddr; f# |2 k \4 I0 L
8 s2 n* H5 X3 J+ E' z ^# Y if(pshreRAM->packet_cout != count_copy)! L3 r0 _5 M0 v$ |' Y
{
7 Y2 `) Z Z# a' r5 l6 W* Z P printf("a is %d\n", pshreRAM->a);5 S" G7 d3 z" e1 n5 m
printf("b is %d\n", pshreRAM->b);
' e$ C) l# B' j% t) c4 t printf("count is %d\n", pshreRAM->packet_cout);
7 A: {8 _+ w3 i+ w C! V- r count_copy = pshreRAM->packet_cout; ~: R$ P) a6 c7 L! X, o0 x1 i5 W. X
}
Y/ Y8 Y# B6 ~ else
" \& j: P- h4 Z7 {: r; E- j {2 Q9 N6 o, g6 I' @6 c
printf("No effective message!\n");# i* v- v: z4 A, k* H$ ~6 W4 S% M
}7 w3 M, ?: I. l3 n9 B
} X1 b2 m# l3 R% X6 `$ B; ~6 `
% x; h- ^# M# x0 q$ W( K& @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( s2 V2 x# N" K0 [$ r: N, G
; ]- b6 H) v5 r; }
, j: t0 |5 M5 m0 _, u7 Y- X3 _4 {2 ?2 R4 b( q
4 D* d7 K; E$ ~5 B/ W9 ?- g: j5 Z6 ]" B
|
|