|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ x: H# M" d2 l3 u9 \- f
7 W; Z7 C0 L3 O( ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& `1 U4 R. _7 J' p: F R$ V3 _! N9 P#include <unistd.h>0 I( b, X! t( G, A, [! Q9 U
#include <sys/mman.h>
# o, H# Q1 r5 i3 \' V0 [" ?& p#include <sys/types.h>+ u: b, O+ L/ W& F9 ^: _
#include <fcntl.h>
$ y& @; c9 G# ?8 E& z
~5 H3 @) ?/ p; O, O( K#define SHAER_RAM_BASE_ADDR (0x80000000) Z; a9 l; U! k
8 h0 t8 E C A2 a
typedef struct
9 O- |: K. l2 R& a/ x+ u{
0 N/ x" Q3 d# R( |! o0 ]/ k unsigned int a;
9 s" o/ q2 s# s; k! V' p! _ unsigned int b;, l; B2 e* R7 @- d
unsigned int packet_cout;
0 V4 Z |% j7 s( E9 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ F0 j5 R" J% u+ w( h
; ]# J3 w9 y& X- ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( g+ @( M! v7 a" j1 U7 Bunsigned int count_copy = 0;
6 w; d |1 n# L4 |- ^* D P" Z
1 ~0 k3 C& ]: {* O9 ]
; \" s) E& k* e7 O1 }int main()
/ L5 n5 \' B6 I1 m, v{9 ]( P% H0 [' i9 ^& p2 E
pRX_MSG_PROTOCOL pshreRAM = NULL;; C7 j8 ]9 d# y. u, G" n* T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) }: {8 H" ~: L0 O8 O- a
0 P* A; q% c* n- u5 o
while(1)' i$ r9 D6 i- z7 `& ?
{
5 i# e) Y7 v2 r% K* s; a! ~ read_MSG_buffer(pshreRAM);! u9 t m# s) C3 p
} 2 k* i M8 e0 U! W' T; z
}
9 U% c" ]% _/ G+ ]& }& t* l# x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 Q, x2 T; k4 S2 W
{, p( A: u/ z! }
RX_MSG_PROTOCOL buf;' Q& k U+ {. s6 h6 p' L
0 W% N7 ~" o) K# R. K- ` buf.a = pshreRAM->a;/ U3 L* S% S- @+ `9 r: E$ G9 W
buf.b = pshreRAM->b;
' f* R1 e* {# _5 B8 M, y" |# f8 A buf.packet_cout = pshreRAM->packet_cout;
2 E2 A$ r% T7 B- Y3 x* `5 p
! D2 e6 [1 f, ?+ n if(buf.packet_cout != count_copy)
5 p( X2 F h+ i) k8 b9 V {# A- d& h0 y( M' O: ~) \
printf("a is %d\n", buf.a);
4 {1 U3 b B) z7 L y( p9 ~ printf("b is %d\n", buf.b);
* I! P/ |* ~* [9 C# ]; R2 w printf("count is %d\n", buf.packet_cout);
! R2 S% b' V6 N+ W count_copy = buf.packet_cout;
5 ^( r5 \0 d s: C, y; ` }
2 I* X* U R9 r& m$ w else6 Z- K/ L7 N1 C& B$ f7 i/ {
{
& _4 ~; l) D! F" x printf("No effective message!");
, S( R5 I' Y3 h( _- Q1 O: P }8 ?+ H h% `% u" e3 t* n
}
. [/ F4 w# y3 M) l: k, @
" {2 k1 _: ^. H1 l G3 b+ z- N3 H; q4 ~& g4 O5 o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 @4 r6 r* S* z0 N& Y1 O) @1 x使用下面代码,对内存使用了mmap函数后:. V1 O- |8 z; C+ a- P1 Y
#include <stdio.h>% f* ~* d1 A6 Q
#include <unistd.h> s# n m+ V# _
#include <sys/mman.h>
! K/ V0 Y l) H$ }5 t d#include <sys/types.h>8 f; _% {+ J! w }
#include <fcntl.h>
+ A' B3 |% X b0 I4 t( k+ U+ g* a8 g5 D+ s
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 j. P J5 k: j- G#define SHAER_RAM_SIZE (0x20000)
2 d: X6 I2 Q5 ^; \; @, e* `! i; \4 W1 m; I% E" p
typedef struct1 }3 r8 T+ x& k2 g2 A2 A
{
" S* j9 T+ g3 }: P' w unsigned int a;
) g* J1 _( \& a7 G ~& \. l) c unsigned int b;
' r2 c0 _2 {& L" G unsigned int packet_cout;
5 H8 Q, N ]# S) E# C3 v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 [& `) @6 }; a4 z7 B! A) L
- z/ c9 E! \2 W& o3 w) Ovoid read_MSG_buffer(int *baseaddr);8 H2 _* o' ]: R2 ] C
unsigned int count_copy = 0;6 {1 n; n! _( d# E
3 B. X8 e9 E: P5 Fint main()
' k+ } j3 k$ I8 t m{- g0 P3 m- ]( F$ [
int fd;4 c$ L& F9 K2 b' H8 F- H
int *mem = NULL;6 X. b7 h. ?; \1 u1 `7 e& G
. X$ a5 ?6 k5 X9 J( ?8 u: V3 E
if((fd = open("/dev/mem", O_RDWR)) <0)/ ^0 @- S" u6 w7 l
{
% M8 U8 |. ?+ @% O' f3 }& N perror("open error");
) x8 h7 v/ x/ Y3 E1 V: J' O- |$ S return -1;5 x) q0 M1 N- Z
}
& J: G/ \+ [& T0 ` 2 \7 j. @! g2 ]4 m, N4 r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 ]) |, E/ B6 Q% ]
/ z8 R8 t9 ?. L. E+ _! y0 [ while(1)
0 t, }+ F" W; g' o {/ b+ ]1 I( W4 S9 J
read_MSG_buffer(mem);
. Y9 P' e" C! C) I; S }
g+ R z% w% ?8 {2 ]8 ^}
2 N' e: n$ z3 P" d0 Y0 S" y3 |
- }8 m* F/ v0 U% @; S* J" h, Bvoid read_MSG_buffer(int *baseaddr)% V7 X6 s: H3 k7 X+ I
{1 j* w5 |+ l' s$ B$ B% e; l
pRX_MSG_PROTOCOL pshreRAM = NULL;0 G# m) w7 d, ^' U; S: s D" B
" d; m$ X8 n8 A0 Y/ D pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% g' j- x1 }5 b, k
`: v$ R1 c1 P e/ m& l' S: E
if(pshreRAM->packet_cout != count_copy)
* j/ M" e& d. d, d {
, J" Z( D R2 f printf("a is %d\n", pshreRAM->a);
5 l9 p |! D- e+ y0 s printf("b is %d\n", pshreRAM->b);
s, ]5 O5 o& M V: V7 ?* ?" M printf("count is %d\n", pshreRAM->packet_cout);1 D. E/ H9 B: Y
count_copy = pshreRAM->packet_cout;
* G7 d# |1 P% e. q$ K$ r, y }4 i( r" N6 y5 ^( H1 _ \# k
else
3 z! P% L2 O R! E( k; I: z {
$ }6 g4 p g2 {* ?3 K printf("No effective message!\n");
2 ?" D" e+ `: I9 S8 E0 ]: P" V6 e: B }. \$ {! ^" U# d2 _
}
9 y7 r# _; M5 @4 }6 B- U- J
% S, l- ~' i) L4 c+ z/ m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: g+ Z1 ^# c0 r1 U9 Z
8 c4 S; X6 q4 x' r# e0 o2 ^1 ^1 [
1 \" T8 m4 h, J0 ?7 j+ l% r' T' [0 Q8 R. s9 f
; e7 p$ p. n( i! A* M, L* g7 i/ J |
|