|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 X* J! N, y$ Z! ?7 U
+ h* W' l& I2 _; Q9 Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; x, F* A1 z. T @' B
#include <unistd.h>3 I4 U& t8 w4 g8 p8 k
#include <sys/mman.h>
E1 h' d. s" v1 O) @#include <sys/types.h>
' Q- `; ~) j+ ^5 a7 `$ a#include <fcntl.h># X7 x* @1 J$ U4 Z
4 }1 M4 z ?* N2 x( N' m8 o6 v#define SHAER_RAM_BASE_ADDR (0x80000000)
2 z2 x6 n8 w! G/ `
0 _* D/ \7 {" V7 o. ]2 Y! H1 Stypedef struct- w( m7 W& w( w$ D, K
{
8 y$ C1 @# u" u. w2 o) j$ ]8 N unsigned int a;
+ d& J0 m. u$ |% R9 x unsigned int b;* q) E5 v, b4 k4 G
unsigned int packet_cout;0 ?: Q" m$ y7 e0 P; j- V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' d: y% b# ~/ {! t5 b& }5 h: d. m6 z0 y; n- t- A1 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. w% w4 u, w4 H' Aunsigned int count_copy = 0;
8 b' {4 S0 q* r
1 }" B+ P. ~) S6 f& w6 G* Z
9 b+ C; b' k1 n. I# y* b$ A6 mint main()
$ A5 [* i, x4 T! u4 [{( e" ~1 @( [' u/ p& i( H
pRX_MSG_PROTOCOL pshreRAM = NULL;& i) b' J# `6 C8 Q( N
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 _4 b$ E- z) @" d: r9 Z- h9 E" G7 \6 }1 s$ _7 x& D2 @: L8 V& B
while(1)
& O. Q+ N- a1 q L# V {
) ]8 g% f6 V0 c9 B3 N read_MSG_buffer(pshreRAM);' e1 k5 y, W2 T( ~3 U+ C
} ( V3 z5 a4 Z& y/ z
}
# k- F5 V( l8 c
a5 \( U1 E6 c5 S6 [* S% o+ xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 T% a6 u7 d8 _' H3 i% R3 N% G9 V% ~
{
U% g E' n2 a6 r) l RX_MSG_PROTOCOL buf;
' r/ V. a: H% W+ \" [ . n8 Z3 Q. _$ h) U
buf.a = pshreRAM->a;
: B9 l) [# c' c6 ]* x3 _. W2 Z buf.b = pshreRAM->b;( o7 |9 O4 f; m8 s4 f2 J3 P+ ~
buf.packet_cout = pshreRAM->packet_cout;* B+ S, K. o% S6 F9 Z
1 j) S0 M, }) R4 L+ j if(buf.packet_cout != count_copy)
. C0 k7 F/ N! }9 L& H" U { S o, h: P: c% e
printf("a is %d\n", buf.a);
d( z$ s/ w1 Y) K printf("b is %d\n", buf.b);
- U. |5 q) I9 `- ?1 c printf("count is %d\n", buf.packet_cout);
+ ?% F- @7 ~) u8 m8 l- ?5 X count_copy = buf.packet_cout;
# Y7 A5 _8 O( l) @ C }
; M7 I3 |& J8 q9 _# Z else
* n5 K/ o( ?. Y& @7 l: D' b2 H. [) U {
0 p. V6 E4 F/ | printf("No effective message!");
U$ n8 J; t8 K& u) z }- r$ X! X) l- a% U
}$ Z7 G+ H- X5 r3 s8 E4 }" Q
v1 I3 o- U4 @+ Y4 u# u3 E, [
. J6 p) [! S+ Q# b8 s* ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) r6 ?; i P- |) ^" Z, i3 C
使用下面代码,对内存使用了mmap函数后:' L/ [0 ~( P9 N# F/ H& c
#include <stdio.h>
$ D7 W; k, L) d( w; t#include <unistd.h>; J' |) F1 S1 {7 C0 W, B) o
#include <sys/mman.h>7 ~7 \% B) ~( B( @
#include <sys/types.h>5 H7 k, z" m8 Y/ u/ ?: w j
#include <fcntl.h>7 j% r1 \; C, o9 j
- [* b8 l/ f _( O% C
#define SHAER_RAM_BASE_ADDR (0x80000000)" A: i, Y/ r" ]3 q: B6 e
#define SHAER_RAM_SIZE (0x20000) 4 b$ G6 u0 }5 H
' P& a- h @* N' r3 v
typedef struct
- H9 H* |6 D( h0 l X2 ~9 z{: I; X! y8 b+ ~6 r+ D" @$ A
unsigned int a;
9 Q* [! y; E M' N unsigned int b;; O3 o( o" R7 q/ `
unsigned int packet_cout;
n8 T' ]5 x" R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, L4 G4 e7 z }+ {7 ^! G* n
# ?& D* _+ U) Z" v! |: yvoid read_MSG_buffer(int *baseaddr);
+ y; |* S) n# n* Tunsigned int count_copy = 0;4 t' g1 B5 V+ A" D2 C0 W
, y' J' R( s$ N. [/ aint main()
$ c# W8 x2 F6 s5 a{/ p+ H' U- p1 {1 ^! L' w% N/ [
int fd;
) b* ]+ p: Y9 W int *mem = NULL;2 V) M1 n w" A. _2 t0 L
- M1 e' {6 q5 s; V- M4 r if((fd = open("/dev/mem", O_RDWR)) <0): p) z0 @* J0 B# g# I$ R
{
) ^% n# B9 D4 f: u perror("open error");) J- {* h% s! o7 e+ B
return -1;. [9 s% i- W' H
}, }& t2 x* ~0 @% E% ^, n
( k+ C8 ~* L$ x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: i# n+ P" q# [3 G4 ?* U( ~0 j
. \* g7 p, }- a/ `- F while(1)) {1 t4 z* q$ ]6 P, |* k& C
{
. m0 U7 ~. p, ~' ?0 ? read_MSG_buffer(mem);
" E! l% _; V/ T& C( z } 8 d w4 |0 ~9 ?# U0 A; Q. ]' ?
}
6 U. m K# Z' d3 ]4 L5 E+ C
8 U) w8 s0 @5 n1 i5 P* ovoid read_MSG_buffer(int *baseaddr) p7 _; T6 z# a
{
) \3 a1 L v: m% o8 ] pRX_MSG_PROTOCOL pshreRAM = NULL;* Z+ k2 |5 n3 `! R' S( P* L6 O
& g& z' ~! d5 p' i( ?( D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& t: P' F3 u7 ]3 D2 f0 C& p% q5 x' A3 R) z6 d* G7 [* Q8 x$ w1 e2 ^
if(pshreRAM->packet_cout != count_copy)
% P3 {7 m- q. ]8 \/ X! A% j* _ {
* u5 S* c2 ?+ Q/ P( ~" ^ printf("a is %d\n", pshreRAM->a);
, E8 z/ J/ b6 N# m( h printf("b is %d\n", pshreRAM->b);
" j ~1 U0 r" p4 p printf("count is %d\n", pshreRAM->packet_cout);8 F1 ~# V* M3 }2 `$ `' S
count_copy = pshreRAM->packet_cout; `; l- ?0 w- I& ~. B
}
; U# }! f w4 E4 h. ]" M( a else5 \& q' c4 ]' G- S- [6 V
{
3 W- `1 n* Q( z0 e% E$ i1 M, \ printf("No effective message!\n");
; R T4 B. \) z) S7 K }
$ [6 n/ |% l$ t' n}/ X E$ r+ q3 F# b
3 C J; V! G. ]' H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 w; m3 T- W; }: t2 o7 N2 }& f' @. h6 U! I) O2 e9 Z, F
0 R b: B" ]% ^& |
7 Y# O( z* p% N! K! C0 g! F+ S: e4 A- N6 i
|
|