|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ]' J8 D# S: m0 ~' N! Z& @
5 R/ u3 o+ w& W3 r, zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* l4 K( L' I" m5 q6 r f#include <unistd.h>
4 V, k) `) J8 _#include <sys/mman.h> P6 w6 \& p/ f0 L/ N
#include <sys/types.h>8 Q# S% J- w( x
#include <fcntl.h>
6 o" p* _# @# I8 ]5 N
- \% V- e6 |& C A% P#define SHAER_RAM_BASE_ADDR (0x80000000)
0 {1 v9 D8 [7 D1 f
7 C) o9 I! A9 vtypedef struct; i2 B0 V: G* R/ Q0 K0 w; V
{. w% F& q5 r+ Q9 U
unsigned int a;
4 d5 A' R3 Q; m" R- x$ ^) @6 E0 p unsigned int b;
. V3 j9 ~9 H1 F unsigned int packet_cout;& l5 k) g2 [% k' F/ U% u( s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 b z! a( u/ p0 ^- m: b! W
$ U$ z0 @3 L$ J* ]9 n0 i0 Mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 p* ]" k/ @* p$ f' Z ~( l2 r
unsigned int count_copy = 0;
8 d; ~( u# w+ X' U+ m$ h/ f3 W* ^$ D4 b8 z. r' V/ @% p& w, H5 m
2 x1 n0 e3 d' k+ J+ Y9 U' Eint main()
' P) w2 z$ ?8 T2 O0 O0 C, W2 q7 m4 k# _{
+ J6 M1 b7 z3 Z: h pRX_MSG_PROTOCOL pshreRAM = NULL;8 X* P" W, s a* k: }0 |; ?
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! [! g* R! |, Y: S* q. W
1 M! i0 s/ T; n2 l0 g3 t
while(1)
8 B* U' \! g8 U2 K2 F, b {
' @9 q5 o' P/ ~4 r read_MSG_buffer(pshreRAM);8 E- i" B5 d e8 W U" d
} + N5 k! a: Y ?% T& W
}
: V# A- e: n4 h' T' G
0 [* o% Y, p tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( U5 y) ?4 f9 b+ f3 J$ u{
+ v& N6 z( e( F6 y$ \& n! D RX_MSG_PROTOCOL buf;8 h; V. x8 N( ], y
: p7 G; Q9 n$ D- L7 q6 S' q* t
buf.a = pshreRAM->a;
; T5 x' B' c: P' r buf.b = pshreRAM->b;
: k$ d/ s( R2 A% g, p+ U buf.packet_cout = pshreRAM->packet_cout;$ B( ]7 V8 E. J# W- T
/ l5 Q$ _' h8 H( N& k" C# I3 S if(buf.packet_cout != count_copy)/ u$ s2 z0 t( K$ R; H
{
" b0 I8 |$ u4 u$ v printf("a is %d\n", buf.a);
5 ~/ T) Q& d& `- o printf("b is %d\n", buf.b);
2 _+ n1 F* I6 ~& T3 X* z, |1 f# y0 D printf("count is %d\n", buf.packet_cout);+ t! E2 D3 V7 N& t5 X J
count_copy = buf.packet_cout;
4 I5 f9 B% W) v8 W+ D }; B4 U( T+ n! J
else- M8 N2 V; d" m8 A' n
{
9 }& K- g! _$ j printf("No effective message!");
# Y) [7 l. j1 O) R+ K& O! Y }2 E1 y4 s, O) Z+ U: p
}
, [0 s0 z( Z1 @. x! m
0 L- T' Z% z3 H) L1 ?/ t6 ~# G R% l' |, } ]% h( l/ X# ~6 ~3 K0 \
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 p4 v% l/ b: y% F; L使用下面代码,对内存使用了mmap函数后:
0 t0 q" _( K8 I+ f#include <stdio.h>( W3 k6 A4 V1 Y- S; V
#include <unistd.h>
' G# x2 p! c7 W- }#include <sys/mman.h>4 ]% z. A) V# u
#include <sys/types.h>
; A6 ?4 ?1 y6 {( B3 [, Q+ E#include <fcntl.h>
- l' Q- D6 z# }' r. a/ B* \7 O) W* P+ M+ C% k6 p4 g+ [) O8 x
#define SHAER_RAM_BASE_ADDR (0x80000000)% O5 D4 @$ H; h9 {" v
#define SHAER_RAM_SIZE (0x20000) 2 O% Y' F" a! r& @2 r3 L/ }
k H' h" }* @: V. Ctypedef struct9 p- v) C8 B! p V8 } e
{
% H v6 ]8 A$ G unsigned int a;8 n0 g# |5 q: o7 y
unsigned int b;
e7 w! t+ F6 W, m0 g' j* D! M unsigned int packet_cout;
: n1 U/ E) C& j/ ]* z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 H7 U6 A( ?% [% B* P9 `
" |1 c% {% f2 U4 d* t
void read_MSG_buffer(int *baseaddr);
/ w' }; r# n' N9 lunsigned int count_copy = 0;
# A* W5 W. K1 X# N T( \( b6 `4 ]* T ^/ k
int main()' A% t8 L( j B5 F6 _
{
7 a x/ s# }4 a; V int fd;
2 X) R# o" ]% L; ] i int *mem = NULL;# Y3 a5 I/ `% p; y/ z/ z# S. M# G
& t8 c# @! U! ]0 T' n
if((fd = open("/dev/mem", O_RDWR)) <0). z7 F( u- k9 v3 f
{
% e5 c! S8 ~( V- a# M& W! u perror("open error");
; ]( t$ ]3 ]4 _ return -1;/ [5 d+ V, ]8 ]3 k1 O+ o! w7 T" ]
}' ?8 Z/ w5 r; [6 a" B
4 r( W! n2 [$ v7 g7 r$ o mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 O) }1 q$ \) [+ K& `# F; o6 y: J9 ^
, X% w! W8 W7 q8 p while(1)
, q3 \8 ^6 @1 Z9 m: \ {; V3 @6 n( @1 y; \
read_MSG_buffer(mem);
+ \; o$ w3 [ m9 d* i }
0 z+ V, [/ n* Z) R2 b9 w}
* l! ^- M/ r4 K# w2 p, ?7 ~
! \7 m4 q7 j! m4 j2 hvoid read_MSG_buffer(int *baseaddr)
7 `/ c1 K! a! s/ M1 `. W{; N6 A# K) G8 K: I3 z/ K; @7 ?! U
pRX_MSG_PROTOCOL pshreRAM = NULL;; o, J+ Q, Q1 R! S, M7 w& T
. p- U% |9 q& X# W+ J$ t( a pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& E* N. O( Z/ c! R0 d
& }5 ?2 o9 B0 @5 A: G$ a* ` if(pshreRAM->packet_cout != count_copy)
, E' U6 s+ X, j6 K5 ~- U {
" z/ z5 ~4 ^' n printf("a is %d\n", pshreRAM->a);
1 _, j; c" f5 J5 D# W" k# o printf("b is %d\n", pshreRAM->b);# c* X8 |2 m2 T6 M4 L( N
printf("count is %d\n", pshreRAM->packet_cout);
3 H& k6 W q2 F a* B count_copy = pshreRAM->packet_cout;
3 Z/ f$ L) M4 L* f0 T% m5 O% D" ? }. p X( Y8 V3 z, B( E; V* I
else
8 W+ n$ o; e/ b/ W# f1 N6 U {
. k6 p+ t9 V0 x. k0 q5 ~ printf("No effective message!\n");
, Z" E7 Q! |6 B/ S8 x }
! N8 @ g+ w" }; |0 H2 L3 w$ \5 [}' ~( g- g+ k7 _0 P
1 K9 }+ ?* p5 ], Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ M2 @6 u. [8 b1 L
0 }6 k0 B) g# K* \0 Z
+ Y" S2 \0 J! D! K' W- |4 G
$ \/ E6 A" \7 ^' }* ]* S8 j$ |+ l# |
4 x' B4 }4 Z7 A- }1 S$ j |
|