|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
`1 O7 E3 \5 ~* H. W( Q q" s4 }0 d" q' H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, ^5 r) \. y G5 G' I
#include <unistd.h>
0 @; d5 _3 G0 ~8 ]/ }8 W$ u6 K#include <sys/mman.h>
* ^/ T3 z* I& h2 j6 Z#include <sys/types.h>0 O% h2 s8 y4 X/ Z* ?
#include <fcntl.h>, k& X# \$ Y9 X* O' {
8 @, J3 D, b: }$ ~; E" Z2 a
#define SHAER_RAM_BASE_ADDR (0x80000000)
* v5 r) _, Z3 O' S1 a
" Y! @5 g) R- y5 @typedef struct
5 J4 M3 x$ @( s6 _{2 _$ Y. R0 V' p9 ^4 M
unsigned int a;- H& ]' \9 a( U2 M4 n. I
unsigned int b;
7 _* ^! t- U# ?! K3 ?2 `% U) a unsigned int packet_cout;
# j5 o u: v. Y7 x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% p7 l; l! E! q1 T
9 U* E! M, c: Y y3 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ H8 f/ p. c: c9 p- g! d4 eunsigned int count_copy = 0;2 X* \0 C$ n( \7 b9 b
1 b/ B0 w. T, p7 f+ t8 V/ N$ J4 `/ n
int main()9 k8 F9 }& n1 P3 @. B
{, E- H! T S1 _
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 c/ f' U5 ?. ^8 r. x+ v" h pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ a; B' [6 k6 ?8 f/ `' \5 E! G# [: g) i1 f" C3 ]# I7 _
while(1)
5 S r( U, _" o {
3 C% U! h! c* J. t5 L read_MSG_buffer(pshreRAM);
* i& P( }0 i* U% O& S } 2 w2 o% I/ [1 O+ L7 O6 `! j+ J
}" U2 l2 B' d* N/ ]2 |! ^1 i0 v- p
* x+ ]4 x# c" s8 K: o( h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). H; Y5 _4 }. c7 @
{
5 v2 X y- V% } RX_MSG_PROTOCOL buf;
, U5 c9 T$ Y! e7 O _& p & W$ } D# U/ E4 g1 g) o
buf.a = pshreRAM->a;2 {7 Q; m2 Z, G& A, I. M
buf.b = pshreRAM->b;$ Y: {/ n. N4 `6 I3 `/ S
buf.packet_cout = pshreRAM->packet_cout;
' r, X5 p# I! c
4 o8 q& J8 {2 _; K l if(buf.packet_cout != count_copy)
, G6 E# l: F9 l {
1 Q- K% ~$ k7 K printf("a is %d\n", buf.a);5 g; ~ E4 W$ G; [1 @7 c# S* c
printf("b is %d\n", buf.b);! m3 L* L! X5 g' H
printf("count is %d\n", buf.packet_cout);
5 _* j" ?& h- Y5 F( K count_copy = buf.packet_cout;; z M# A; `& w& f3 I" d: R% w
}
+ |7 O# R p( a) s" M0 }- o else @. g$ D0 f. ^: b
{
Y7 |7 O. V$ x/ }7 L' M printf("No effective message!");# [7 K* j5 \$ o& d' R4 I
}* D7 |2 m+ v7 q: t& ~' H' `
} P/ E7 M% E" N, i/ [; b# |# N
5 I" U6 ~- u+ g! Q' Q* D; m& o% \3 H& m& d
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ P) z5 t6 e- o7 M) L使用下面代码,对内存使用了mmap函数后:
( L0 g* ^1 r- N! m" i+ ?' }#include <stdio.h>1 R! ]6 A# N& U" Z" e
#include <unistd.h>
$ i( |4 H, Z( T' m7 i#include <sys/mman.h>
w* }% l9 I1 M. s; ?#include <sys/types.h>% I1 d/ G6 C" V8 m1 m2 P3 \1 D: j3 G
#include <fcntl.h>7 f7 \* X2 Y5 G1 _7 u/ E5 @9 z
- ~, ?2 }1 K; Y#define SHAER_RAM_BASE_ADDR (0x80000000)+ P$ r! a9 N4 Y, y1 W
#define SHAER_RAM_SIZE (0x20000) ( l: q" R, Q) Y; i0 D5 n
7 A" M) F2 |% e' y- R' E0 ^* U4 \
typedef struct
2 c$ z! W$ N; P) D1 m{ ^/ i1 W: ~: |) M$ N6 ]8 X1 }# Y
unsigned int a;
, | o* A6 J- R% o) r$ B& T6 F unsigned int b;" e- w1 v: o5 {: ~
unsigned int packet_cout;
5 A# R" V: ^2 i% f6 z, y" ^}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; b }& H5 O9 L \
4 L; \6 k* P9 j6 |" f# K
void read_MSG_buffer(int *baseaddr);/ ~8 V4 S; [' E. u7 E
unsigned int count_copy = 0;
" a/ ^0 e- Z" n( l$ }/ ]* O0 d
8 V% u: @; n4 G& t2 Xint main()
7 y0 k$ n+ {& @4 {{' P& E, f' G" y' D* T
int fd;
! P* G$ C$ h0 D# N" D" _! } int *mem = NULL;
% _# m2 h1 @1 W" g. c+ ]; x/ U- g3 @% }' G5 d Y) r
if((fd = open("/dev/mem", O_RDWR)) <0)2 q1 H+ z* R, q) C9 u
{
5 n3 ]2 r2 j8 X0 d5 M( s: g) N perror("open error");
( ?5 V6 O1 h3 J0 m return -1;/ w* L, _8 C! ?0 F
}1 S, X+ W) L- |: V0 z8 W4 B8 R9 I W
$ C. R% J5 T" ~; {6 ~4 w) u" [, [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 ]6 V$ T7 w7 u% J! c# r z+ o/ m0 X
while(1)( h! P9 S7 M+ ], N, s/ @ N- X9 m% H5 I
{0 w% | [2 V4 n( [; R+ \5 q
read_MSG_buffer(mem);
% }, ~7 a& f+ C1 B }
3 S5 v4 @3 _* ?. }" X" ]}9 f% d- N. c5 e% O" J* J" B
) W# n2 r8 d$ O1 u4 N) ]void read_MSG_buffer(int *baseaddr)
$ s0 l# M( P) h0 |{9 z) H! N) E( [1 Z }0 P4 M1 }( d
pRX_MSG_PROTOCOL pshreRAM = NULL;8 A; t/ P; i/ r& W) m
/ S; f- p, p. y9 N- T& h% U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 k2 ~0 X( B8 f) o5 c" G% d7 a( q. X$ A( V
if(pshreRAM->packet_cout != count_copy)0 ` B$ D& N, }' W A
{6 g0 s% B+ _. O; o5 Z) \/ H% b
printf("a is %d\n", pshreRAM->a);, G' c+ L( j( C0 a5 v: E
printf("b is %d\n", pshreRAM->b);
7 ]1 w& [- _' J# [2 J printf("count is %d\n", pshreRAM->packet_cout);3 J( d/ H8 @8 g% C
count_copy = pshreRAM->packet_cout;
& D! q2 r; q1 l, j }
0 x3 R3 }4 w3 z7 H$ i else7 D& Q* h. g- o
{
, Q: ]& \4 e' a2 a+ V4 ] printf("No effective message!\n");" }6 N& \) E, K2 F
}
4 k8 j# J! I6 G! T4 N}* y D; z, O9 [/ m( j3 I% _
5 o& x" i: Z& c K1 \) q: o4 b# b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 h2 d6 j6 l8 U# L$ ]! @5 C
6 p& ]+ {) U z8 M0 O2 t" l* N1 X3 Z" X2 O) d
C1 r0 J# e6 j) p* M g+ M s$ Z' N: r, V4 y7 S
|
|