|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# f* J [4 ?6 w+ f! j8 Z* J" o5 y, d( |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 T5 |" W: _6 o: r: Z
#include <unistd.h>
# z# i+ C4 f" f& { ~7 V#include <sys/mman.h>
4 F$ V; `2 ], x" F#include <sys/types.h>
0 g8 q" Z" X. l+ I3 `- T% s6 Y#include <fcntl.h>
i' G* H; f4 o) H: c3 w9 \4 e4 z9 E/ k
#define SHAER_RAM_BASE_ADDR (0x80000000)
. z: y) e# S% R
- u6 ?. K$ m8 V% Ctypedef struct2 R' S) Z7 Q c
{" q* V" K" ]; R; v( U; q% C5 Q
unsigned int a;
) m7 [/ G0 _7 g! o" v& {; Y: [ unsigned int b;
5 J& a! w' @( t4 v unsigned int packet_cout;: K5 m, ~" j/ D T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, X( x W5 j. U k# Q7 R
$ O/ }1 H0 {% P5 x8 d+ N5 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 G1 L$ i/ a3 k5 N% Y/ Funsigned int count_copy = 0;0 M5 z. @; y1 X
0 i2 z- m5 b+ l$ X6 c5 N, ~6 \
& t% Y, G- w: `1 J2 E; |int main()
. F: Q+ ~' R+ P2 e" w# {{2 i3 o. }( u1 Y9 L. P
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ U$ n* k- k+ v. j5 \! o/ r pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 G+ }) o. Z5 R* v1 L' M5 k# t. V4 S( A- ?5 w
while(1)
9 v2 l, O$ ]5 l, K' l {
2 R. I! I! x4 U- ? read_MSG_buffer(pshreRAM);
/ u* [ N, B/ |% m }
! q6 Y: @: T9 {9 a/ Z6 g9 [}8 V* K2 k, e6 \) a# R& Z; A! E
3 {2 z( G- L: ^& `3 k. K7 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ \4 m9 r8 ^9 E$ Y9 N- D8 P
{; o8 w( _3 U3 }9 n; B4 I
RX_MSG_PROTOCOL buf;9 }1 m6 S2 y6 `6 m3 F2 j6 Y1 F: I
4 |% }9 R6 v/ o8 C$ _6 U. v5 w buf.a = pshreRAM->a;/ |/ w( o% {9 e2 o
buf.b = pshreRAM->b;
9 g7 {- r$ q W, i- ?7 Z) S6 a- J buf.packet_cout = pshreRAM->packet_cout;
y' i& |: a" { " D. c( g- o) v& y5 N. ~
if(buf.packet_cout != count_copy)
2 @- I s9 @+ Q4 U: C {- M$ [; h$ v0 n g7 h! T! g6 g
printf("a is %d\n", buf.a);
$ i( g6 L3 H' _ printf("b is %d\n", buf.b);
3 \ E- F$ D: T9 }# b6 @5 H+ Q printf("count is %d\n", buf.packet_cout);
, B9 G+ s+ [5 Z count_copy = buf.packet_cout;
3 |2 \4 p5 a J. B8 @2 ? }
7 y# I0 B3 D( a3 Q" _2 r3 m else
; b2 t3 ?$ J* T1 i {8 ^: S% W' B6 ?4 v+ z6 r2 g+ z; ?
printf("No effective message!");
. ~1 ^- _/ }/ h }
/ R$ Z; Z6 {( z7 r5 j( t; g}9 Q9 j8 P8 k+ Z/ g+ z1 I2 m
0 E% R @0 K7 e# `: V& w Z
+ P$ p8 Y( C4 g0 x
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! j. `: t, m" i8 `% _! f! {( B- S
使用下面代码,对内存使用了mmap函数后:
9 c5 P) a6 l* c( O. t6 Z2 M#include <stdio.h>- V: @( M; e; Y
#include <unistd.h>; F1 S6 \7 ~' r: R4 B8 t$ M
#include <sys/mman.h>
4 ^7 C# L8 Z6 Q8 M3 ]: V#include <sys/types.h>
/ Q$ A u9 l, p" m7 Y; Z#include <fcntl.h>0 F7 s7 o; T, U- i
8 D6 K! P4 s) V. r& p- w
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 F5 U, S: t0 l1 Y- s#define SHAER_RAM_SIZE (0x20000) , c& E+ q( D1 ]1 D# H
0 v9 u# u! ^! G& X" a
typedef struct% k5 B5 E2 ]& z ^9 z" b
{3 L3 R% M k0 U' `
unsigned int a;4 t+ ]$ L: |& [
unsigned int b;
w; v+ `4 \* U unsigned int packet_cout;; E0 A) `- t! Z9 F; J3 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;5 p% k5 j1 F0 l8 [# N
: s8 V2 o; f) r. {5 Y% Y9 }void read_MSG_buffer(int *baseaddr);
: |9 N. F. |6 ^0 ?# h9 b5 [unsigned int count_copy = 0;
( T6 O/ ]/ i- ?' o/ t$ h }0 n0 ?0 s
0 c0 d, d0 T2 _ Yint main()4 m ^5 e; n3 v) a" q" ]7 u
{
5 c2 K# v" n/ @( [3 r5 o- X int fd;0 Z" X) G8 K: [! W' [
int *mem = NULL;, s( u6 [ G) ]
% f; B. p! ^4 ^& N+ t' _7 B
if((fd = open("/dev/mem", O_RDWR)) <0)! j r. s) _# S
{
7 n. t( x: w5 H8 k; b perror("open error");% Q; o( R; ]2 c1 d5 w
return -1;
* W7 V' E% J, O9 V g4 f/ W, f }, e' l3 R# g7 \5 M1 W) y
- H& D( f- `- a3 c7 r) j7 P mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( U7 g% a: C- y4 s
: V8 j1 r% Z9 a- G
while(1) J* V8 b# v4 s& o2 i: |
{
# y7 C7 C$ |+ u* _; W4 m. t* a read_MSG_buffer(mem);
6 u; n2 i5 b, D+ k7 L }
/ F/ {, ]: Y$ C/ ?3 W# Y}
5 ?* _9 W' ?* r8 {$ E0 }7 C# ~, z1 C* h* ]
void read_MSG_buffer(int *baseaddr)) U7 B7 l* k' z8 G- E0 `
{
$ }1 l1 E$ {. i6 { pRX_MSG_PROTOCOL pshreRAM = NULL;; @* g& z2 q6 v
, a |5 f' @4 p9 L, E3 z0 K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 t, M* B' O' m I
0 [ z+ g* s% [+ `" R if(pshreRAM->packet_cout != count_copy) |: b4 {. X) V5 L& R l' s
{- Z0 R( ^+ x! s4 l7 I0 `
printf("a is %d\n", pshreRAM->a);7 ^# K& ?( {/ G' c
printf("b is %d\n", pshreRAM->b);* t j6 @# Y" T1 q& {( T
printf("count is %d\n", pshreRAM->packet_cout);
+ w% v5 i+ _& G# V# A' z, w: I2 z count_copy = pshreRAM->packet_cout;3 N+ ?& k9 ~" h3 B
}
. N& S( T! R" M6 @# | else
/ V3 i% j$ T* ?$ Q/ B$ c* ~ {
t- q3 J1 F' |6 W4 c4 A5 _ printf("No effective message!\n");
1 c, Q( H% i, U+ y- R- _9 p4 y8 x }, n9 q4 z4 @3 f n
}
4 o' w" G4 X' v8 |4 r. o3 I" K0 l# C; V" k/ i+ g- v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! n: m4 T3 p4 @/ @# q
$ `7 t) @, R5 f ~0 f K
8 k3 {# {$ D# R. R
6 [1 y7 ^% h+ {* g" N( k
' s& X. m+ g/ o% x |
|