|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . s5 C7 h/ e( G, O M6 ^
" t3 J; z$ m% X, S" ^9 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ S% s. ^9 K4 L, N- Y# q
#include <unistd.h>+ Z5 S1 q% G3 v0 ^ e' m+ \$ N
#include <sys/mman.h>& B+ `6 q" U; Y" s9 W
#include <sys/types.h>
1 v$ {: j: V$ Y) z#include <fcntl.h>
5 A& E# G# a4 ?8 q$ G6 g- u/ H# I# w) [- T
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 i+ }, P( S* X- d
' v" W1 H( g5 V; [+ ?1 xtypedef struct% r4 S) p6 i; F: T# `! q0 m. \
{* l. d4 S/ v; U; v5 G
unsigned int a;
& q, k( j; Y+ d3 W7 h: J5 d unsigned int b;9 Z- |6 o. ]' S4 ^7 I& D% O; r
unsigned int packet_cout;
2 Z* X `( o- Y# \; c9 Q* q6 Q4 M% O$ M}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) p! k* N2 e; Y. d; } ]
5 i) o' a8 V0 p. ^) ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( F3 p+ ~% ^$ Z* c9 `4 C+ j. j# @/ munsigned int count_copy = 0;/ h: Z3 H% b6 e- L+ i' n1 X6 i- U( R
4 t9 D1 k* E2 u- Y
( V8 m Z7 k4 W! R
int main()
, P3 F' K, }3 z1 W- C{
) d( @- r2 p( w+ x+ @9 G. }- F. [ pRX_MSG_PROTOCOL pshreRAM = NULL;2 u6 d9 ]4 u+ v4 p) o7 j6 G
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" K, ?# ?+ X9 s' N" m2 Z8 x: N4 B Z) S' o" @
while(1)
3 V* {. b0 L9 l1 P0 w% } {9 L; z' i8 V# C$ |) `, |( }/ r
read_MSG_buffer(pshreRAM);- u& V1 K" P7 {& n7 {0 q1 P7 ^
}
6 D+ e' Z$ b! N( X}, M0 G- s5 y2 F: z; k# ^1 Q; B
, {* l g3 S1 _6 g: A( Q% f% F% Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 B( Q( a: N+ N& Y9 }3 u
{' J- r; Q4 e6 q& D& G# X+ r
RX_MSG_PROTOCOL buf;7 f, g5 t1 ~2 @* |# P7 a
- a/ M8 E) v1 z8 i
buf.a = pshreRAM->a;
t% Q' \" ~9 Q- U& y2 F& ` a buf.b = pshreRAM->b;+ G8 q# B& K9 f! r
buf.packet_cout = pshreRAM->packet_cout;* L% |& b6 {. `& O+ A3 H+ {3 e7 Z
* N# i8 L; p+ Z8 A% b* ?, `
if(buf.packet_cout != count_copy): H; ]* A6 e; o9 ]
{4 [6 m( G* P! b/ f
printf("a is %d\n", buf.a);
. I6 O2 Y3 I/ Y, c K* y- o printf("b is %d\n", buf.b);
+ H2 |2 F9 U3 @, } printf("count is %d\n", buf.packet_cout);
& s1 V: Q6 b4 k* k% b: N1 }/ U+ ] count_copy = buf.packet_cout;4 t$ }" F) a2 e( \5 r3 Z7 \+ W, e M1 Y
}
& E+ P+ s, Z0 \% I9 D1 ^- U7 K* d else- _4 @5 o- O' w. T2 A5 V/ D1 X
{9 q( P3 P- b$ ^- D
printf("No effective message!");
& p0 ?1 R5 ]+ C, @+ u Z' h1 y: e }
* a% j+ I$ U5 L: z}
b T$ r, F H8 k+ \7 z: t& [& @8 t- H6 E! a- W, X
: u, U/ r4 t- J3 m4 s1 T6 e4 e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 f% o3 g; p7 ~- E7 y m* R使用下面代码,对内存使用了mmap函数后:0 N- h) p" b# w. _
#include <stdio.h>
" H* d" y, u4 w9 B' z) F#include <unistd.h>) b% y8 Y9 k' l2 [9 l0 @
#include <sys/mman.h>
" I, K( }* o% a1 B; }#include <sys/types.h>- Q: ]) ?9 V# U7 M; o& u& W
#include <fcntl.h>
6 M0 q1 a5 k) r. X
' d, @" Y0 L* E8 V) t; c' k& \#define SHAER_RAM_BASE_ADDR (0x80000000)5 B6 h0 B6 r! ?. n( V9 {
#define SHAER_RAM_SIZE (0x20000)
# Q( `4 [# f6 m6 d* I6 y8 j8 b1 o& T/ V
typedef struct
8 A q' @) E" c! X{4 [( R5 f# G: f; u" e
unsigned int a;
% ^3 B# v5 g& D: n. d unsigned int b;" u- Q% T8 q; x9 v6 e
unsigned int packet_cout;
2 D7 ?) K" Q8 [" \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 z: a8 [( H, I# w y# M$ z' M" `3 |. r, e3 T
void read_MSG_buffer(int *baseaddr);( H7 y7 @" c$ s# d
unsigned int count_copy = 0;, K+ w* k; f C9 {
# `- Q3 w7 ?! ]- l2 `3 y% zint main()4 }6 z" M# H, o6 R) L
{% a7 C1 O' B/ p4 O3 l5 @8 |
int fd;
0 Y1 X/ J$ g; a/ I( S6 n# n- i7 b int *mem = NULL;
9 D' Z' L. g8 m: v3 K6 p' H/ p$ ^" }, \, d$ Q: ~
if((fd = open("/dev/mem", O_RDWR)) <0)
) {7 `3 t7 k0 a0 e) u: n: X( j4 { {
% t, \% Q% d- N6 y8 s# [- J perror("open error");
9 c5 `7 w! A5 w+ R- N return -1;
, v. j: m. g4 b* P4 `% A }! t/ E' I$ y& h% x/ k3 V( [! e
7 W# X& m( D# s+ X! J% u mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ i `( i/ ?2 N; Q& i
$ [" E; ~$ k0 v$ b4 B) c6 y& A while(1)
* x& j& ^# u9 c7 ] {6 c4 p: D% [# W1 I! l. C
read_MSG_buffer(mem);8 E- N( }- r; y$ c, u2 N( b
} 8 q. F* ]# i K2 b% e5 v
}6 {; b; Y( K! d
# t5 Q& {! J g# O- I+ u& pvoid read_MSG_buffer(int *baseaddr)
; i: m) Z( m* n; @3 @* {{
9 O- N, V% d V% w: D pRX_MSG_PROTOCOL pshreRAM = NULL;
4 }0 {! o) R* b; `: [. N
8 R4 H1 Q0 ]- ^ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;' u; ^# X9 n2 f+ C
* u, Q8 v1 O8 X g$ x# D if(pshreRAM->packet_cout != count_copy)
. f% }/ z( w. Y8 z& E& G$ g {8 s( ]5 R$ u) h( l* _4 b
printf("a is %d\n", pshreRAM->a);
: l& C+ b( Q) s. y1 F7 | printf("b is %d\n", pshreRAM->b);
" d; T: d, @$ h* b printf("count is %d\n", pshreRAM->packet_cout);( d6 |. m5 ]. x+ E: i2 R* m4 X
count_copy = pshreRAM->packet_cout;9 b b0 U( E9 j, _7 ^
}
' }, q- O5 a! X# Q else
0 o8 n/ e4 Y$ k b( Y {6 W) |2 E& w; U: H! L b
printf("No effective message!\n");
: G# t. W, ]. b g& ~' H }, G5 M" ^+ k0 p, Y* z) Y) h
}
. X$ q4 S0 i1 m# g- Y! O$ ~; k3 p. b, w! X" n8 M: s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现??? B/ m9 m3 d! ?0 Y* _" E" i: x2 Y
9 M6 z: h' G! i+ ^: X' o
' `2 |9 D* Q; [5 a5 b! g
. K5 l% M% s: w1 j
6 U- d1 D$ |0 M' \# Q8 y |
|