|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 P/ @7 X: t3 V9 [* |. E1 W& K
; r: N# w; W. \5 h+ k6 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ a2 ?9 W* x f9 Z+ F#include <unistd.h>8 `' D3 n4 k3 R0 r
#include <sys/mman.h>1 B. F$ @- j4 k. q
#include <sys/types.h>" ?6 \+ q; S* t# M0 T6 z& h3 J
#include <fcntl.h>
U3 ~, K7 t2 a
; z4 E! S: U3 d2 C( J* e#define SHAER_RAM_BASE_ADDR (0x80000000) / f1 Q X# v3 F8 D1 F
o5 T+ h/ f; M, A [% p- {8 y
typedef struct
( ^$ H) _' V1 M3 K{" i |1 e- g; K! Q, T8 K
unsigned int a;% a& Z- n- y) z* O5 w
unsigned int b;) y; k9 O- c. P/ O7 G& S$ N4 ^: U
unsigned int packet_cout;* o/ d$ C( G) d" A4 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ?+ a- `& T% N
* p, x; k& n) W7 w& O# q' ?5 C8 Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" n1 f+ L4 Y9 y" Wunsigned int count_copy = 0;
# O( y5 i6 A- x) R
4 u3 k' r) g; }3 @0 ^1 b. f+ n* `6 I0 N2 v
int main()
0 ~. t0 t. n, z1 N6 B: l{
4 H$ u( N4 h. a( y1 w& L pRX_MSG_PROTOCOL pshreRAM = NULL;
- S) X+ O2 r& P- b pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR; u+ N" o3 n) j
1 f& l R( h# j& D, ]! n
while(1)
# E. ~! Y* D0 j$ x0 A/ } {
) v, N7 T1 q" u7 I! R% a2 m, z7 `0 A read_MSG_buffer(pshreRAM);
$ w* L% K6 o8 V9 H! O" p } * i# m+ _. X5 J2 o* @
}
2 t' N& T- |; Z) X5 v4 i% o1 [; l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& h# Y( W, |1 Q/ P, A7 U$ D
{
E! g2 t6 ^& Y1 }* ~7 J& \) j RX_MSG_PROTOCOL buf;
7 b( ^! Z/ ~& ~ - W. K' i r8 u, o, X7 j
buf.a = pshreRAM->a;
$ h6 z4 d3 ]4 s `9 o) G: b8 W buf.b = pshreRAM->b;
" s! i ~1 Z6 X3 Z' i' m0 G buf.packet_cout = pshreRAM->packet_cout;: s6 f% y& ?# e$ [/ y9 [( |. J/ Z
2 z# R* l% r" i' P' L: e0 ~+ u" A if(buf.packet_cout != count_copy)
! r3 Z, z( T. A# k& B2 J {
$ m! d# c% B: i% C) O' x' i# P printf("a is %d\n", buf.a);
& w, m! h7 w! W, l" L- r" E0 D& F6 M* S printf("b is %d\n", buf.b);4 F% b. e& h- `& ?$ i
printf("count is %d\n", buf.packet_cout);
* @( t7 f l8 d7 g, b8 E4 n p: A count_copy = buf.packet_cout;6 o! W. ^+ D1 R# m; }' ^
}4 B+ W5 h0 g: v0 D+ ?# @ p4 {+ u/ z
else/ t+ A. d, n C7 W$ o
{
1 J* o7 r+ R5 R9 s6 o printf("No effective message!");# @2 T7 \- j" F1 E- z5 t. K( Y
}
K& K' S4 V1 o( E T/ ]1 ?% l& }- Y}
( o2 o$ o( y! ^6 l
! m7 X, n5 {1 T* A% B; ^; T' T; y! P# m& V4 z9 o; [, u, _+ ?% J4 B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 K/ L! h9 K0 ]3 {% u, |使用下面代码,对内存使用了mmap函数后:# w5 H5 @4 E, x- c0 V: B
#include <stdio.h>
5 m( M% Y9 E8 }8 _# b p* o& y, a#include <unistd.h>
& _9 I: R2 v) W#include <sys/mman.h>4 p( Z+ u2 M0 l \
#include <sys/types.h>
; g+ Y) G" I6 x1 g5 j. C4 T2 ^#include <fcntl.h>
5 J7 h% c- f8 P: H4 _* n7 {
& V P3 R& b* A$ S#define SHAER_RAM_BASE_ADDR (0x80000000)
! T3 x% o) z+ ~4 N% G2 ~#define SHAER_RAM_SIZE (0x20000)
. h9 T( U2 L( Q5 G
' \0 D" {1 T' ttypedef struct
" e9 T0 \( k/ b# K{
4 f& e( [$ B" ?# Z unsigned int a;
0 U9 D& ^+ H/ k2 | unsigned int b;0 _% R6 \) K! R) R" A& G
unsigned int packet_cout;1 ~7 @. e% h+ a2 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- T: A# N1 D* D2 B1 s5 I% n1 \4 j, N+ m# y+ _
void read_MSG_buffer(int *baseaddr);
/ }) P( d2 f: |9 G6 r# {2 D1 lunsigned int count_copy = 0; [6 R2 y7 A$ M1 r) O$ a
0 P# U1 N+ t2 h$ l0 _" w9 Dint main()
( y3 T5 h8 w; [8 t0 j7 X/ X5 d( l{
p) I) Z# `9 A7 {* h: }/ | int fd;0 S4 `1 V% V) L# i+ X
int *mem = NULL;
( r1 k: `5 H" y+ x) E/ S8 D/ s$ w- f8 d/ j) e9 E) ~) G. p/ N
if((fd = open("/dev/mem", O_RDWR)) <0)
6 u/ H, j; C7 u8 @ {
/ S8 c7 p. }7 Q: z. E3 j perror("open error");, K" d+ W2 u7 K8 {: B$ H
return -1;
* W0 Z$ f! m% u8 y }/ J: H0 V) o* Q* U# W
2 s9 [* d# G% e9 z, }5 u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
p1 X" a. F5 a, t- U2 x% C* T$ N/ `( `( W
while(1)! a# ]8 b# }8 W: A' m; {4 ?% Y
{
d6 X- }4 G" x" O) }5 z% |/ y read_MSG_buffer(mem);
+ \' M- F; T+ O0 S- @: H& l/ x } 4 E2 l. h: F0 k L3 q
}
) L: P) |7 T7 ~
. f2 h6 A/ P# p5 }# kvoid read_MSG_buffer(int *baseaddr)
8 O, |5 l1 j' U{
8 `0 z o) j: w" h+ g. N& b pRX_MSG_PROTOCOL pshreRAM = NULL;( H3 B4 |" X+ d. C1 Y, |
0 ]; V! G v8 R2 ] pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ i0 Z7 d2 i, _# h& }+ Z3 P
8 r0 z6 A$ u. x! b if(pshreRAM->packet_cout != count_copy)$ j* D4 f. Q$ h1 J4 g3 p
{
! J8 x b9 H: t7 E& N! Q printf("a is %d\n", pshreRAM->a);
" A( c! ~. }: O { printf("b is %d\n", pshreRAM->b);
7 A9 m" b2 `7 l- ]5 j6 W printf("count is %d\n", pshreRAM->packet_cout);
& m6 h3 X! _5 I8 p8 H# A+ A" u count_copy = pshreRAM->packet_cout;) c6 q6 B; j# _) h
}$ z# N/ d! I f9 b, M
else0 n1 ]; D9 E) e$ g" A6 f* I
{
1 j, ?7 t3 A) `: ?- }$ Y printf("No effective message!\n");: i' z4 y4 O; i
}
0 N% A- I9 _- p}
/ P$ a- G0 N8 Z7 I7 X
; x# P$ X i3 A$ I2 [没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???2 H' E# c- ^/ m" |$ O& Q
! p1 L: H! Q5 H! j
5 p) O* O# z* A5 O; R& E
! f4 B% Z& m0 a9 `& l4 [# \' W; }1 t2 w
q4 L$ f# y$ {# s. e0 Z |
|