|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ Z$ l. p5 h( F, C
. ` u: O: R6 U; B3 R6 A, mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! c4 t. l8 h* Q) }* J
#include <unistd.h>7 N$ y b; }, S) X
#include <sys/mman.h>$ n! u9 ^ v7 L3 S
#include <sys/types.h>
8 S$ K: D; V k' r* O/ |#include <fcntl.h>, Z3 w4 z8 S$ Y6 u$ y+ F# V
, ~4 Z- _$ Q0 }0 A) s" X7 W" m#define SHAER_RAM_BASE_ADDR (0x80000000)
( S5 W1 F+ T4 y% H0 D' N, P& H
) w8 U5 @) ?, t* }9 l0 Wtypedef struct4 E! F1 T4 K4 B }: v& Y* [
{5 j" o- O7 Z& h0 P4 X* c
unsigned int a;. F: [; i# k! N) |4 C4 e
unsigned int b;& z/ _6 E' @& ^6 E7 t5 j% @! `
unsigned int packet_cout; O$ p( \& H% r' z8 W" v9 b- Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" N y! v/ i/ w' ^
% V$ d9 A' ^/ a6 H& {' y& `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 C! w% {- k7 Tunsigned int count_copy = 0;9 q" W& x" B; P" y
3 Y' `8 s+ s% t* ^( m/ f! {! Y+ q( e& X+ i3 J( {5 N# e8 q
int main()
5 o, k5 B. W4 U5 K{0 w7 r5 O& Y+ K5 S# \! C/ L
pRX_MSG_PROTOCOL pshreRAM = NULL;; p, B( m" H0 b
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 _$ d5 _# d; A3 D" v
4 l; ?6 J* E2 L9 [7 M0 q while(1)
2 A# S5 _7 \, P) T% l {
+ ?+ J; ]1 P5 [0 A read_MSG_buffer(pshreRAM);
; \( o, ]9 R7 ?9 P2 r& l( V }
! K8 B- \6 n, V5 y) x: L}! J3 a! c- Y C
4 |9 h2 C+ G4 c4 D" N8 ?# o, Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) e0 I) M, v. r6 d4 N/ s4 @
{
$ B" d8 s! `9 k3 r RX_MSG_PROTOCOL buf;
# {. C4 @! X0 n( E1 L0 W ) S5 x* V! r" U5 d" X% Z' _
buf.a = pshreRAM->a;1 a8 m% w7 G, X2 m( p) c
buf.b = pshreRAM->b;
4 b" ?& K# V: a. d2 P% J buf.packet_cout = pshreRAM->packet_cout;, \" }- h- l' o7 E9 I4 R
6 G0 N8 Y8 B, R- e' G
if(buf.packet_cout != count_copy)
: T/ w8 V2 p0 g4 y! Z7 } b/ E0 G9 p {
. S8 `/ e( P# m/ x( R& B printf("a is %d\n", buf.a);
; F! J+ s$ q5 c( C% N9 S! x& n printf("b is %d\n", buf.b);
1 p0 l) Z) c8 w# r( M- G4 X9 q printf("count is %d\n", buf.packet_cout);
* Q. f; }6 k9 K( U, p% k4 e count_copy = buf.packet_cout;
& O. _) Z; ~/ a' `7 o f } t* M1 J& N& X( N
else
0 g1 Y! ?+ {: Z- m( G7 l' f; M {" q# @3 Z+ y& Q" x# A% S
printf("No effective message!");
6 _* P5 o# o Z8 v- [8 k }2 C9 O% D- ^! m5 ~3 E! t
}( P: e N" @; [ L$ O/ P1 F1 |
# K b6 z6 G; A* _' O! T5 f
4 z0 K- ]; t4 u: u0 a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ A7 I9 M* y( J; a; [/ X使用下面代码,对内存使用了mmap函数后:6 _1 k7 V8 L6 A6 _8 ?0 e
#include <stdio.h>2 o! A( i1 I3 `
#include <unistd.h>3 s4 J2 n6 U* z, p' E* {' O) m$ F! O
#include <sys/mman.h>
' B) L! H! u$ o6 g0 h6 |) H* l#include <sys/types.h>( Z7 A Z) v: I: u7 I$ Y7 Y
#include <fcntl.h>* f. B( v! b/ r" |# r
7 k" B: K7 ]1 F% |- X1 q" i! n
#define SHAER_RAM_BASE_ADDR (0x80000000)" _ a" \% ~# Q) }( ~5 ^: z
#define SHAER_RAM_SIZE (0x20000)
9 U T0 n$ I( D- P# M7 m$ K4 \, i
typedef struct
6 _# u' R" T2 c6 ?* H( Z4 N' r{2 K$ \; j9 g! T2 v) ]) `( q( q
unsigned int a;: B. s( P% F1 J* I
unsigned int b;: E& D' ?+ A6 _) X- x$ @3 ]
unsigned int packet_cout;5 n- ^; Q; y7 \7 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ?; n9 k5 Q5 w% I
# `4 Z7 p, S; Cvoid read_MSG_buffer(int *baseaddr);7 N* X: U3 _: K: t
unsigned int count_copy = 0;
, e( E4 ~) p- p r4 i$ q+ R8 x5 k4 r5 a) F i. w" Q
int main(). u o8 e$ q& o. M
{7 Z) ~# P- A8 \6 u p/ ]! f \
int fd;; o0 m6 \" i' d* r, j: x
int *mem = NULL;3 K6 G9 T9 ~6 G6 v7 }! \- ^# S- T
3 a @0 k0 I0 u* Z1 k5 A9 W% d } if((fd = open("/dev/mem", O_RDWR)) <0). t% u0 }! V- z
{
7 p8 m1 C; y, Q O; Y perror("open error");
: G1 L8 ^8 L7 ~ r return -1;7 T. u; e( V6 c) V- L3 t
}2 ^( t- A3 A$ P
* T3 }' K4 }- d8 C% Z8 n& _ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 Z: D# r& X1 M% x
9 m, C6 i% s- O- a; y4 w while(1)
; p$ @+ U/ N. M$ j+ E {7 n' e/ g/ M! \. k4 z6 ^4 F
read_MSG_buffer(mem);
, P% C5 J- h2 ?* E8 b } 3 a k1 O" ~- S0 x! @. _
} H& }( X- R6 F( P2 v
5 _+ [4 K- W# E3 ^+ C( r: v4 bvoid read_MSG_buffer(int *baseaddr)
! y! l" s8 ?7 `{/ c ?; f2 d4 s2 W! u# N+ a
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ f- }# Q t/ N- k/ H" q0 _9 t
. v- o" p/ @# y pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% s) J: f( D7 R$ B* E- y
5 u' O# H8 t1 _4 s' [3 x+ O" H/ p if(pshreRAM->packet_cout != count_copy)
5 P; R9 {$ g' x( U7 a {6 G/ p0 ^& ^' G. x; N# Q5 P
printf("a is %d\n", pshreRAM->a);
5 w# K$ I( Z& C( R printf("b is %d\n", pshreRAM->b);
- W' x: ]' B2 [: J: N' g printf("count is %d\n", pshreRAM->packet_cout);) V$ K N9 F% E. i' B0 |8 ~
count_copy = pshreRAM->packet_cout;
o" t: |9 u# A( x7 p }
9 c) u3 \& a1 i else
) t5 i* E# R4 R; r) C" t, d7 k {
) Z$ V/ U! M! a8 p% T. Q printf("No effective message!\n");
& C" H( m; ?0 {# l }
# e% a& G& ? ?2 V$ z8 v7 f' d}7 b; q% Z# y4 j i- @
2 b5 |' e& h' S8 G7 g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ y3 D) F, ], B2 B) I6 s r% d. }4 l. _1 g' \, n" Z |
, P7 ]9 I: f- R0 ^' N
% l. A4 p. V# D0 r! Y+ O0 [7 y! G. b" I
|
|