|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 E) N$ Y# k/ O" a
( w9 Y- ?5 _; _; rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. y4 Q/ h: E S; Y9 G4 j* g#include <unistd.h>
' o1 K }9 _& d$ I) z( U#include <sys/mman.h>
; K& `' ?6 K6 t1 k#include <sys/types.h>1 M! Q( N: @ V2 _7 l, y; e
#include <fcntl.h>$ K% f5 N( O# [! p: u) j* {" t2 m
( Z! h0 p) U5 K3 {/ L! _
#define SHAER_RAM_BASE_ADDR (0x80000000) Z5 U; t/ k- T( _
* k# ?7 V% Z! B% A+ q+ }1 j
typedef struct3 m7 G" Z& C2 x' @" \* G+ f8 _& l
{ q3 f* l% Z$ |! a7 \% L: \; [
unsigned int a;4 I9 n. z9 i+ p& [* g" L
unsigned int b;
7 B: G% E6 G ^5 U# |( G unsigned int packet_cout;) ~4 f' P% ~( P2 B) x) M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" Y: P b4 v# A1 a
, f! k f- r7 f; ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# h7 S" ~/ F) y8 funsigned int count_copy = 0;
, \8 x4 M& Q' \+ n9 f: @6 B1 \5 S+ T3 Z& A- Q, `4 k( v- o6 l
9 |9 [! _9 `' [ j2 {8 e/ Iint main(). ^( l7 V; s& v" H# ~9 S W0 ]* z9 E- n. X
{1 {& i7 S# e# r- k- P, f6 M
pRX_MSG_PROTOCOL pshreRAM = NULL;
) a3 ^* t3 n8 K. U' w pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 C; M* R$ \7 F' g6 s
: M6 }# W3 R$ i. e5 T0 p; s while(1)5 [2 Y" c ]7 _! P
{
! x K1 `# `( N1 M read_MSG_buffer(pshreRAM);
' k4 n# S f. d& [) t' C& w8 p }
$ C# u3 h4 ^) \+ k- ]}
3 W. D- U5 ]( a2 [5 N J
3 d3 }0 i8 z' uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- s( A4 v6 g d0 _% q8 N
{
% c& c+ u* d; m# \" X0 g* D4 w RX_MSG_PROTOCOL buf;; R9 `5 ]. A0 _7 k7 P! z
) D2 g* h2 R3 m" U7 v/ K! E& n$ ^ buf.a = pshreRAM->a;
) Q: J8 Y& U- F% M buf.b = pshreRAM->b;9 {2 P. C- e# ~% A+ B; w
buf.packet_cout = pshreRAM->packet_cout;
. y) J# J2 G7 w: i% A- h- C3 V 9 V# M# N/ X- c: o! G( G
if(buf.packet_cout != count_copy)- g' Z; ^. y2 E* z: |5 [
{: l- d v3 r% S$ @ z
printf("a is %d\n", buf.a);" T' S/ U' q! i1 h+ X& Q
printf("b is %d\n", buf.b);
/ X/ R' A9 o9 `, y! m! V% K$ C printf("count is %d\n", buf.packet_cout);; b |9 r- x/ d- `0 a
count_copy = buf.packet_cout; Y, I! w: a( ~7 z- `% Q% D
}
& {. W: A5 A6 R+ Q7 ^# D) E else
# F2 C+ M. M- r+ W9 _( h( H {7 q) y' `0 q6 \
printf("No effective message!");; E1 j: L4 Y/ o& \7 K, o5 _
}
+ d( q) D& Y( Q( p}
% \, T: Y# Y" }6 u, T% j% t* t( o6 c' ]) x* c$ B. P5 `- W4 A+ e
2 \ X/ h8 p/ F! d6 L) b但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ t0 t% a( J: w+ h8 f, r3 R9 w使用下面代码,对内存使用了mmap函数后:" m. g" ]) \: q N4 [9 B$ h6 Q+ H
#include <stdio.h>. B* N+ x* x* L8 m
#include <unistd.h>( f- x6 K0 v. d6 e* I3 e: f4 W
#include <sys/mman.h>3 P: t+ F* M6 G" o, v4 J" P
#include <sys/types.h>0 I/ b8 h& Z- t$ Y. q1 s
#include <fcntl.h>7 e; o5 \& u3 d2 @, v# R6 q: z
* p! y1 T( q3 [4 z
#define SHAER_RAM_BASE_ADDR (0x80000000)# _: g# K2 e9 N
#define SHAER_RAM_SIZE (0x20000) 3 \0 K5 m e p6 S3 @* ^( P- ~
: v: o" I6 n, ]; u9 ^! V5 A* k [
typedef struct& h# H; i9 v2 E! {' L. ^
{
8 d9 ?4 i+ X. ^! H) i) C* [/ _7 j unsigned int a;
/ Q% D2 K0 D0 D& G unsigned int b;
4 g/ Q2 x! f: r( Q2 j unsigned int packet_cout;9 {- o2 A8 C, T) i$ S
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% L- M) e* |9 R6 c
2 ^1 t' u+ k3 F" H% ?7 mvoid read_MSG_buffer(int *baseaddr);
; ?) P9 ` W; \( }9 Uunsigned int count_copy = 0;0 b7 ~/ \, k0 v2 X2 a7 r
! \# f& G8 P6 S9 ^4 [; {4 K
int main()2 e+ j3 e# [( ^
{: W8 w6 T+ N; V1 `1 F/ |' B0 t
int fd;
7 F }' f) n/ e int *mem = NULL;. f% Z& l; z; [; |
- l, B" \1 e4 @+ w' g6 o
if((fd = open("/dev/mem", O_RDWR)) <0)- Y5 k; _' t& g6 t5 @$ M
{# w1 Y6 M1 ?( T; q
perror("open error");
' s: N( l" K7 M: m return -1;
' J/ Y: T% U- A0 I4 s) d3 \# G5 d }
2 F0 U$ q, F+ e. `
' H: F% f3 N$ i+ q0 M3 }) A8 u mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 u6 @0 }2 p% h7 `; S5 g
8 q3 r" K" k, h( B. ?8 v, z while(1)
- R# v5 L. H+ J' A4 g {
* j6 L- i- e; D h7 D f; r read_MSG_buffer(mem);
" r( e% z$ S4 ]& V4 f5 Y, `# \6 t) ` }
/ s2 i" s& T1 C}
. ]9 t4 F( W# |( V. ]% A
: m: s+ h: e/ kvoid read_MSG_buffer(int *baseaddr)# C& {& h; K% X S9 j, |* \
{, \; ?' }/ Q7 [; p* |
pRX_MSG_PROTOCOL pshreRAM = NULL;
& T1 C1 u. D. j0 O" N% ^, {
, |1 ]+ E$ [# `6 j pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 i' N$ P+ a# [$ w9 N& X7 Y
0 u+ E8 e$ v3 a. m% l% C if(pshreRAM->packet_cout != count_copy)( c2 d9 C+ {* q+ V6 q
{: Y% g& ^6 `4 }2 Y
printf("a is %d\n", pshreRAM->a);3 h/ c. [& R$ c: {' z" j) n
printf("b is %d\n", pshreRAM->b);1 n7 H$ x: l- W
printf("count is %d\n", pshreRAM->packet_cout);; n, j. G$ P! t6 S; ^# n# q) v
count_copy = pshreRAM->packet_cout;
& C8 A3 Y% Y4 q' j( H }
' m; u( e' j3 h; W" p5 E else9 F) R, _/ u9 |8 C! z
{/ D0 N' e/ l1 e3 \8 @7 v4 h) b
printf("No effective message!\n");
+ U% P0 K/ d/ q7 R }* \) w+ b( j: G
}$ I8 ]% L! e ^% E( ]
! \( j. e6 ?1 J4 \5 u0 ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( J. d) `+ e4 R
0 W0 W% Y1 ~& a- v- Z2 G/ U. R
& e* U( `7 h; J" Z; m- }, ^3 i5 ~9 }
( X, J0 B2 K! b! J/ ^ |
|