|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! _9 P( H# }( I& J1 u/ L
* F; `: W9 g" |1 h1 A q8 D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ w/ v0 ?& V5 ^3 G5 n' r& y5 @) |. W8 X2 z
#include <unistd.h>
# j! D3 B2 P, p+ w- A" `#include <sys/mman.h>; e% {7 o; X, o+ R
#include <sys/types.h>! A7 L# P0 ~ L0 s8 u
#include <fcntl.h>, X" ?& z" F. H* E
/ O5 u- G. l+ N# X! O" @* V#define SHAER_RAM_BASE_ADDR (0x80000000)
' [6 J$ m' Q$ T H7 u; _( T2 N2 B5 B
typedef struct( }: B- H/ B [
{+ j6 R4 O9 c7 \( B' s, E
unsigned int a;
2 Z. Y4 p$ t1 K9 D unsigned int b;4 V# X8 C! O7 K; `* w) y. C
unsigned int packet_cout;& r; U! p. U0 I* z/ n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 X& Z9 Z7 L+ X$ O3 ]6 a, Q. W/ V
2 Y" _5 c- T' B( zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 k( P% N3 t- q% P5 y5 E( Punsigned int count_copy = 0;1 Z! x: [0 h( \+ {- Z
/ L7 d* t5 I; E9 I( `! W3 J6 R( S/ ~$ P) t
int main()
' ^- a1 r9 ^6 D! i4 D{# [: ^7 q, {" Q ?1 w
pRX_MSG_PROTOCOL pshreRAM = NULL;& D6 q2 u: A- ^% U* j
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. S/ T3 _0 B! N2 I9 @7 S" t6 s0 i( ?1 i: A% N- ~* o' @
while(1)
% Q+ k* T/ c7 q) @3 O {
+ y& u, `5 x0 e! H read_MSG_buffer(pshreRAM);( v) ~% g" x& X5 t) y5 }
} $ a- J" q6 r% G- s
}
. x. e* E r" y/ {- ~
% b+ `' i8 p5 ~* s2 M$ ?! i& Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; y7 Y" Y) V& q# x2 r{1 @0 X9 A6 X- t \6 \$ d, c
RX_MSG_PROTOCOL buf;
t0 W" Z; _ e 1 x$ ^9 G, }% D/ O. F& N
buf.a = pshreRAM->a;
5 e+ q6 }. W! H6 ~4 d! k buf.b = pshreRAM->b;' i( L) \+ {" w0 i7 a- {, W5 ~
buf.packet_cout = pshreRAM->packet_cout;
p4 ?9 ^6 z$ P8 z
+ y) j' w e7 B6 p7 I/ q. { if(buf.packet_cout != count_copy) g8 I5 h$ ~! ^" _
{
7 v7 z$ X5 Y# b printf("a is %d\n", buf.a);
5 }: n, T' q; o. D# Y/ W1 x printf("b is %d\n", buf.b);
+ D2 y C4 s8 ~4 \, _ a3 T& x printf("count is %d\n", buf.packet_cout);
0 ` M1 D7 J2 I) R% b& z# u count_copy = buf.packet_cout;
5 E' o4 D; O; m4 G& R }2 x- _7 Z7 \; M0 p
else
& Y& N' M0 |, b0 q. A, c {6 C) k! M4 e5 p! a" O z2 X# C
printf("No effective message!");; N$ ]7 } i; m2 f7 z: \
}
8 E& f# N6 `, k$ a p' H. q}
5 b% |; Z( x. C6 Q5 l. \/ c8 {; [: w- ?. h0 _* k
2 i. B4 ^, j+ R( P m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: ]# u8 |/ o& n% o$ g: f& }
使用下面代码,对内存使用了mmap函数后:
8 Y5 I& U) R6 N9 C7 P#include <stdio.h>
, s1 k. p6 l* ~% O/ U#include <unistd.h>
6 l# }1 E4 _% w, h; o# M1 _#include <sys/mman.h>
c* O" M8 H; p& g/ _. ~#include <sys/types.h>/ h# D. p3 H' ?) c: q
#include <fcntl.h>
) Y7 r% ^5 o4 R. S
5 R# l }$ l, u, D; p$ D#define SHAER_RAM_BASE_ADDR (0x80000000)
+ ^! E' d9 f# M+ i2 ?; l#define SHAER_RAM_SIZE (0x20000)
$ J; ~( g* D. n7 {; Z/ d
/ G. F! n. T+ g& Q$ C9 Ltypedef struct
( x2 Y" M$ h/ G7 H) t9 h+ @7 M{
0 V q% x3 {( V# p6 k+ r0 a4 o( S( M unsigned int a;5 B8 u4 T/ N, u
unsigned int b;
8 O4 b0 G# z4 n unsigned int packet_cout;; p* l' e9 C. G, s# E9 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% E% o& \, R: r6 O; S. L6 g4 Y2 J! K7 z5 o/ |3 H
void read_MSG_buffer(int *baseaddr);5 }' K4 a& S t
unsigned int count_copy = 0;
: y `, i1 ~+ S( p3 e0 c( w6 {
n- _0 k& u7 _; w' {0 }7 Tint main()& x3 o" H9 x2 C Q! Q# R: B/ o
{! B1 X8 J1 L# s% Q, j o. l" x( w" g
int fd;
5 K4 L U" r0 ^( o int *mem = NULL;
7 i! H& g7 ]! i8 {- ~. V+ r2 h& J1 y! l' y" H5 l
if((fd = open("/dev/mem", O_RDWR)) <0)% l) @; J4 ^1 f" Q5 j# R
{3 v6 h: Q3 m+ Q& ^
perror("open error");
1 }" B( |! r1 ]/ h0 l$ B/ r2 \ return -1;: P. J( Z. Z: i7 B2 \% e
}; q5 G. ]+ O- T6 _% r+ f
3 Q1 l$ X* \; \) ^9 A9 ], z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);1 P* V+ |# z! V: U9 ]
- V$ J" D" a( L3 e while(1)
( Z) s1 [8 X* Z0 v" o- m0 t {5 k9 r& u u# N
read_MSG_buffer(mem);
' z* {6 y, B: T# m3 g" F } 3 F" y6 n, ~, b" z/ }
}
* e1 O" |+ t) d" E9 o' I4 w3 P% x! j+ |' V: z
void read_MSG_buffer(int *baseaddr)) Q9 ^; P3 k2 i1 ^) R* `5 I8 A7 f" N
{* Z5 r5 r7 ^: N* f7 e
pRX_MSG_PROTOCOL pshreRAM = NULL; V6 X' a# G- }4 \5 D1 S d K" ]
( m! `7 g- x& ?, q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, j: B' G+ G$ i' D9 d. F7 l, g: i
- ~: e- }- l0 `, x4 W: W
if(pshreRAM->packet_cout != count_copy); j' D0 ~# ], ?$ H* M/ ]4 d
{
) _4 a+ ~# K* D+ |$ ] printf("a is %d\n", pshreRAM->a);% t8 [) h( T5 J4 f* l
printf("b is %d\n", pshreRAM->b);
6 t1 a4 n# K! r0 b printf("count is %d\n", pshreRAM->packet_cout); @; M m7 D& c& ^5 ]$ B
count_copy = pshreRAM->packet_cout;
& I! B- c6 J+ c4 V }% G+ I# ]! a$ X2 q
else
4 J# C1 y+ i0 c& M% t {
d1 M0 ~; u/ h% W5 v5 U" t; E printf("No effective message!\n");
' l: R8 i1 ~% k/ k }
& p" \, C: C$ T}* a9 |2 w; O' Y+ E# W% H2 B* G* I
/ P$ o. T1 z4 a" L6 O: J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: {3 r& K) i2 v* u6 y/ W* L4 G
z7 v% B1 r9 {$ b# v% J% T( A' y7 W7 f8 q! X \
9 d; Q7 R, X( d F% L- M$ j1 [
1 b* Q; |. `6 e9 n
|
|