|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' t+ V: O/ e+ x2 P) U
$ e1 n; l0 e1 gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: p2 j3 W. r, I9 _, g#include <unistd.h>
7 H! }( C! I6 e% ^% A" h$ [#include <sys/mman.h>$ ^) `6 c$ J2 i+ R7 A
#include <sys/types.h>+ U2 Z/ o5 K) G: Z7 ~
#include <fcntl.h>
9 W5 p+ k" X7 R8 g
+ b+ [1 s& b9 N: D( R#define SHAER_RAM_BASE_ADDR (0x80000000) 0 }4 p6 L6 s/ ^8 ]8 o* G* m! M
8 g: }/ t/ Q" m2 T4 B7 K
typedef struct6 w$ S5 t$ j! K. W8 a2 R( \" _9 Q+ U
{
8 i, D0 I- p; c5 U$ R unsigned int a;6 k" [4 p+ ?* s6 K
unsigned int b;
. A+ H! M) X& ^ unsigned int packet_cout;: ^/ n B }( k) n8 w2 C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& ~! J2 V+ ]- k! T# z8 V
9 p2 x2 d+ |; v. c. pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# ~ v; x- V1 T3 v: {3 ^% V
unsigned int count_copy = 0;
2 z, E; }. A1 E) V5 }# `" Z- k
) d" X2 d h+ w" S5 [: @int main()+ \, I, A ^; L, A4 t
{6 K0 r/ F+ p }' V; e3 L, }
pRX_MSG_PROTOCOL pshreRAM = NULL;
% v$ C. H$ T/ X. i3 M" X* p pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. T5 m5 E, n" e0 O5 j+ z! |
' {* b# m4 Z9 o$ v* M+ _
while(1)/ L4 n" n: n5 t m' \( C2 {
{
: b/ D" |4 G) A4 Z8 x read_MSG_buffer(pshreRAM); l* R: P2 @, i+ B+ G& `! U
} 1 {/ y7 s! k1 P# L G+ @
}$ A% _2 `- a( {) g6 C
8 s3 o; e$ {% J! M0 y% s) w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ }5 Q1 \5 \8 K( y, S- V
{- N! f7 D% G9 z
RX_MSG_PROTOCOL buf;, z9 e4 U* u; e. t
+ F/ @9 H' O, A( c; v& T- R buf.a = pshreRAM->a;
7 @. `& \; V. _' {+ J buf.b = pshreRAM->b;5 k/ K( l7 t' ^$ }3 n* ~
buf.packet_cout = pshreRAM->packet_cout; n& e, ^% J" F# a# y
4 u0 z* ~# e: x \
if(buf.packet_cout != count_copy)
/ m- f; O7 `. f/ v {
8 [( U* `3 _' [. p printf("a is %d\n", buf.a);
+ \! B1 `8 F8 m printf("b is %d\n", buf.b);
9 s: i( \) j3 D& M( D printf("count is %d\n", buf.packet_cout);* v0 B8 o7 R3 T* c% v% L; P; w* [# |
count_copy = buf.packet_cout;
, r4 f3 H+ R# Y" K0 O$ u }
7 \9 i, }6 }7 I" ]7 E1 h else& J, [, b# S) _1 v" p
{$ L' I* c; {+ p: J' J+ J5 f# I" [( j
printf("No effective message!");
" Z q" V& @/ U0 f2 n }
8 [0 S$ g0 n y* s}
3 S3 c4 }8 `- F; p! O3 f' @- J0 j3 q
& M( S% L8 E t5 G# ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 H* v( o- W; Y: ?使用下面代码,对内存使用了mmap函数后:
% N8 z# G) |* H$ @% X$ Y9 f' V1 v#include <stdio.h>) u3 P4 Q4 c0 G
#include <unistd.h>
& A* u5 A# S$ {4 o6 K#include <sys/mman.h>& O* I( m; [- a7 L; z* {
#include <sys/types.h>
" p8 W6 ^& C( _$ y8 H#include <fcntl.h>/ k! |, {( \+ ~8 S1 C! c' L
3 k+ @+ M0 v7 X4 J l4 s#define SHAER_RAM_BASE_ADDR (0x80000000)
) w, h( d# q' `1 [2 c5 o6 x#define SHAER_RAM_SIZE (0x20000) 1 x8 p" R7 C, O' Q" o
5 {; c4 J) _2 A3 d- i; Ftypedef struct
& ~& z% S" s' d% x T! K" i, w, q{
: [ f) m2 ?8 K unsigned int a;
- f' L+ J6 j% S) J unsigned int b;0 P( d3 u& a! o
unsigned int packet_cout;
) x4 ?! A) x6 j& q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) I" }; Q7 t0 Y$ h# z6 u6 [' \& n3 b! c' o" p& W0 g$ H8 ~
void read_MSG_buffer(int *baseaddr);9 c: R( o9 T" M4 v8 D( d
unsigned int count_copy = 0;- m3 P: A# D: ^5 m. H5 m
( L5 p. I; L; q8 T& x, V- \/ j- b
int main(), Q) f# ?, I& p, _6 m- x
{
4 ?/ Y+ @) j. U int fd;
' d) W3 ]# Q, J) G# G- H int *mem = NULL;! B2 n8 r+ o) i. X+ m! P
5 _7 y2 e6 d/ q9 X+ l5 |* D; y if((fd = open("/dev/mem", O_RDWR)) <0)
5 K4 E+ B& b. d1 Z. {- ?- L' O {+ c5 g5 k! L( M( p. P
perror("open error");( [$ s8 A% J) Q. v( J. X0 G& `
return -1;2 n) T2 `8 F, L D
}2 Q2 l3 R7 Y [, u4 {4 U2 B7 C; d
0 H+ K& F- k! g5 r% l
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 X2 R/ m* j3 C6 K# K. I3 D# S
4 x" K6 R5 x9 a
while(1)5 j0 S, X7 `* Q( N. U4 S5 Z
{
+ r% h0 _ h0 U% H! Z. r3 x read_MSG_buffer(mem);
6 |2 b4 T$ F- ` } 2 p" [. L3 U& {
}' w. A7 {* I$ b* `2 n( k* D
& M" u: ^; S& g+ M( m
void read_MSG_buffer(int *baseaddr)
( |# O0 O# u6 m7 a3 f% S{
& R$ I. P9 t. A! z G Y- j pRX_MSG_PROTOCOL pshreRAM = NULL;
0 t- E: m6 | Z! N* U# P
D7 n( v& b5 o5 e- |8 l pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 o: Z& i/ d6 k% c( `7 [) ~5 r; @ o: i
if(pshreRAM->packet_cout != count_copy)' i5 e# h# r _/ \
{
' J; e% `/ ~& W1 T" U0 _ printf("a is %d\n", pshreRAM->a);
; T/ Z u. B& s; { printf("b is %d\n", pshreRAM->b); O4 C5 I* x$ g, Q. q
printf("count is %d\n", pshreRAM->packet_cout);
1 x; P+ Z5 j# T8 j count_copy = pshreRAM->packet_cout;
- Z% Z) j- ~; i8 a* _3 y$ z }
: T' |$ Y3 B" r: N+ p, b+ v: v6 f else/ w9 ~: S0 r5 X
{
' W b+ k" Z. V$ {( h printf("No effective message!\n");
# s- z* h. f* [# W" V1 j) ~ }
. |, ~" k3 B9 ^5 f0 }3 k0 L}
/ H3 i, j- U, G# d, ~$ z$ N7 }% ~3 p# k& L+ X) u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 o8 l; K% g$ X4 H% Q8 y7 W) {
8 i; T1 E: E+ j/ W: d, P" N- O8 ]
! S3 Y1 P/ S+ @$ K2 L8 u7 q; Y7 M- J. ^0 v5 D( y5 Y
, q3 \% s0 E$ \9 A |
|