|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - [* Y. u) X# Q6 ?0 O. U) }& [% T' t- X
1 r3 y3 @$ h( k8 X" L1 }" z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 T( [ Y1 q/ l* P# f' W#include <unistd.h>
* f: l1 f- n# }+ G% o4 i0 K* P#include <sys/mman.h>& V7 @! k% Q/ T3 m3 J
#include <sys/types.h>/ C6 p0 B7 P; G0 s! q6 r
#include <fcntl.h>
- l8 i, @! z5 Z& C: s4 s, m* ^; A8 V) [& ~2 a, S6 n
#define SHAER_RAM_BASE_ADDR (0x80000000)
% n1 L2 |+ |# e/ z' j9 H0 b
6 R8 S* k" H( Mtypedef struct
! z9 W+ E ?/ E# ^{
" y+ ~) Z; a7 x5 f j unsigned int a;
& F) t- m- b/ z unsigned int b;
5 O3 @! U) A& r6 T7 u. R unsigned int packet_cout;; ~7 U- I$ I+ J8 x9 H" l' O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 u: D U" @2 ^+ _
1 {% Y0 H/ M( y+ q0 U5 C( {) V' e& nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' O4 F* h' ]( d2 v+ i/ t
unsigned int count_copy = 0;
- Z% G, F) o* z. Y8 a1 S
) z/ g8 J) l1 n" G/ [2 ]
+ ?$ D( @) R) `& m: @! j Nint main() J' d& O* o# \7 x: b4 Y$ N
{
3 y6 n. D3 o# G" b2 t. |2 O2 g# z2 l pRX_MSG_PROTOCOL pshreRAM = NULL;
4 ?0 ]4 @% P h6 [0 y pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 p" [1 L A4 q8 Y9 P
0 N! E/ b3 t3 y9 s; d8 O: a& k; m while(1)
! P5 s, }8 O# s( c {
4 N5 }2 {, a4 ]$ n read_MSG_buffer(pshreRAM);
! S4 `8 J# W8 j3 V9 h }
7 F; w/ S" t+ ` ?}
( S8 S$ h+ `; T, D8 h. v
1 _ g$ p) M+ W* @% C* B5 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 W, z% O! ?5 `1 V- M
{
4 L; k7 m1 N4 ?8 t* F# |& n9 j: X1 Z! ] RX_MSG_PROTOCOL buf;" ~; L# I9 `" J( `9 G+ _. P
+ M: E6 z2 ?- \3 C4 b
buf.a = pshreRAM->a;
9 g: \+ \, {6 q% C: w6 U buf.b = pshreRAM->b;
0 [; c8 w( I5 N buf.packet_cout = pshreRAM->packet_cout;
0 S9 Q* `2 |8 Q9 |$ i, o: t
1 ^ Y5 e4 m* x+ g* n if(buf.packet_cout != count_copy)
( F: m |3 J; Y& t2 i' a6 v, l: a! F {
5 ~1 \4 T3 i5 L8 E: f! w5 Z2 i2 c! l printf("a is %d\n", buf.a);, m! \/ Y) k$ o0 M; [
printf("b is %d\n", buf.b);
. x" v8 N# E- G" U5 I' { printf("count is %d\n", buf.packet_cout);
3 U6 ~. X* A$ s' W: t count_copy = buf.packet_cout;
6 B+ X- x( r+ [$ w$ s8 P& m. v }
# r, e2 C- E6 B$ y3 m else
/ J$ z5 s2 j1 A1 y: C$ G# w2 w B {3 S% R0 s- n/ T n2 r' C
printf("No effective message!");8 ^4 B3 e* z* W
}+ j" w1 b8 M$ n: P
}
C/ w+ }9 [0 J, ^9 b9 T
" S- u, R. Y8 n$ ?$ a( u
4 r' K" N" }" s3 m4 \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% r. @1 m8 R6 p' q$ Q2 x* N
使用下面代码,对内存使用了mmap函数后:2 m5 ^& }! H/ t
#include <stdio.h>
+ a% j# R5 a5 a+ T( p) j! G; C#include <unistd.h>
6 J3 F; y8 A# z f& w#include <sys/mman.h>* \% Z0 p+ y7 \; l- S- K
#include <sys/types.h>$ _8 j6 ?: y) U" S# d( g* i
#include <fcntl.h>
+ I& u/ b/ N& L2 }/ a, \. K2 w
6 B1 U! ?: a- k5 O; f, ?0 _& @2 J#define SHAER_RAM_BASE_ADDR (0x80000000)) f; K! g' K$ Z; j
#define SHAER_RAM_SIZE (0x20000) 8 s6 e3 H6 Z# |! j, i6 L9 l' J
7 `. e/ ]9 m/ ctypedef struct: _; ]* p/ C8 W3 N' V* u
{
9 |( E" L9 y- _ unsigned int a;6 J+ B# @9 b5 K4 U9 E( J& f, D8 h
unsigned int b;+ C* t; y5 M- W# F
unsigned int packet_cout;& F8 ~. X. S5 ~/ B$ [6 \- v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 k$ O5 u" l: r' B. C
1 }5 j) B9 n0 B" y' wvoid read_MSG_buffer(int *baseaddr);
' s$ X3 |9 D- ]/ k$ k) b Tunsigned int count_copy = 0;6 [" G3 G3 F3 l( b
0 _; m3 [! n Z6 L9 ^) X7 |3 Fint main()
S: i; t3 b+ v i{
% f# W1 }) v+ J$ c; S% r/ y+ K% \4 s2 ~ int fd;
# H" B$ k& z1 L. i' q8 f0 Y int *mem = NULL;2 N, B8 m4 _6 r
1 I. b3 [! E, ]/ V$ U! j6 S* I if((fd = open("/dev/mem", O_RDWR)) <0)* ^% ^6 D2 G: m
{8 O! V: C' @& A$ O8 B5 e
perror("open error");' L, q; k5 G9 D0 Q! j
return -1;
$ l I H9 K t- P5 }6 e% A }
& U( F8 E0 K: K: G, q: s+ {% e1 W 1 D% ^3 N8 @5 y9 v9 U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
9 T) O( M) X7 y+ [: x4 Q3 O5 ?
; v0 l, u6 {. ?# U0 ]' m" l while(1)* L3 S! K% s; G- {% |
{- d; B0 c, a' ] T0 b
read_MSG_buffer(mem);# J6 g( {# C$ E: n Z! r9 C
}
' c8 W3 G5 B/ r} @& _- E, n8 y
5 S p9 N1 V) W1 T9 V" I L) R
void read_MSG_buffer(int *baseaddr)( Y7 A/ ~7 x$ f6 n( I# I8 j- W
{
1 G7 u: S& m* F' B$ k pRX_MSG_PROTOCOL pshreRAM = NULL;1 L$ U& j7 a+ K6 X5 o9 P
4 K$ B5 X; V7 P pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! J; L# x# F3 I) R# h6 \! ?
( N* o6 W9 b3 m0 e2 X if(pshreRAM->packet_cout != count_copy)
4 \ E/ h* b. H9 Q- ]- G/ `) s3 @ { ~& M& i- d; t% T* q) Y0 q
printf("a is %d\n", pshreRAM->a);
$ E f; L5 i, a6 k0 S5 k) Z printf("b is %d\n", pshreRAM->b);; W1 @% \8 E3 N
printf("count is %d\n", pshreRAM->packet_cout);' N% \6 I' L! x Q
count_copy = pshreRAM->packet_cout;( N a$ x2 V6 [6 }
}
; d" ?* ]2 B9 C/ m# N; p2 \' g else+ M6 p# R, n4 P! a X
{% q8 W6 @& g3 c. q, d* |' N
printf("No effective message!\n");
( p1 W5 q8 Z* D9 ?' x* [ h }9 \9 |8 O$ C9 q% @2 ?
}
R( s7 i% G( J& F8 T2 o+ y) L i. J9 c* x0 {* K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( o* v; P7 {; G- D5 _9 Y- o) }4 q* X3 T* Y
. k6 g7 o1 L2 \! ^
; x% \9 \- [3 W$ x! W
$ G* C3 h7 @$ d' | |
|