|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : f7 u+ `" c5 o/ R5 w7 k p$ `9 R2 }
, a5 I1 i! v% f$ x5 [- ?OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 x# u9 `/ j% Z#include <unistd.h>
+ o' O& `* h2 r9 E5 c#include <sys/mman.h>
' X3 d u# U! w: V. |3 J5 t#include <sys/types.h>; L; K/ n0 `5 l, [# k/ ?
#include <fcntl.h>7 a1 ^* M# ?* o4 D$ R( T" w& B& n
. U: o/ t! V4 Z, |; b
#define SHAER_RAM_BASE_ADDR (0x80000000)
% J0 m. P( f+ C7 V6 Q5 a( N( u$ U! J7 C2 P
typedef struct) [" a- M6 \: n5 J; V) n% ]/ S) Q( Q
{; C7 u4 `2 |, l: q" d
unsigned int a;
* _# o. G* r% ?4 k5 V unsigned int b;2 J: D K* M5 o7 B
unsigned int packet_cout;8 c' a% g1 E: T# D1 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 a) \! ], \0 ~- Z! j+ k+ [
: c1 i' q, @; B$ d: e9 z; ?. D! rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ `: G5 T. O# U2 u0 x
unsigned int count_copy = 0;5 k6 |" w6 i: U$ P# U: @" i2 |
7 D% m$ J [+ P& Z, s+ W9 F1 e5 v$ y; ?1 j
int main()$ G+ x9 |" _% ]* [
{$ K! s: G& u1 M9 U/ u$ `
pRX_MSG_PROTOCOL pshreRAM = NULL;
) X0 k* H$ j8 k, ]- F: v pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) i8 Z8 \! |, ^ x9 @2 i
* ^- b+ ?% s6 U+ _ while(1)+ l4 b0 l. o! b j
{
5 Y8 ?2 J1 `$ I: j6 A$ `# { read_MSG_buffer(pshreRAM);
! i3 ~! [& e; ^ i0 m } 9 Z3 h- @3 M) M' j4 U9 r1 U9 |
}
* W2 A6 W s2 x; S
6 s! V; I, N0 g( e4 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& j. b1 j. K7 l, [! J{5 K+ j9 P; |5 o- \/ s
RX_MSG_PROTOCOL buf;' n9 G; n9 }' v9 L; g
+ i0 R. j( y; X+ P% ^ buf.a = pshreRAM->a;6 ]. J% Y1 l% r# B6 `0 O
buf.b = pshreRAM->b;
G @1 O* L4 s% O B) E buf.packet_cout = pshreRAM->packet_cout;
% G' e, |) s& c5 P7 P # o2 }/ o" e. n1 f9 U
if(buf.packet_cout != count_copy)0 E2 Y( D: W7 x6 Z( f
{
0 p# n3 |& f( D- Q" x) c: A printf("a is %d\n", buf.a);! E# q" m) s+ F5 E% ^
printf("b is %d\n", buf.b);
' }& f( N1 n6 z# C7 X2 u printf("count is %d\n", buf.packet_cout);# q+ t4 ^3 W, ~4 O% b5 d
count_copy = buf.packet_cout;1 n N E X( w8 I
}& J# w& C2 W# [+ {
else; n0 ?" X: x6 P) K( Z
{
3 S4 p B; `4 c2 }8 g* u printf("No effective message!");
' j. d: M; M7 n9 |! l. A( j }0 v: \2 j; i: W# q3 K3 x
}9 {$ Z' S" }! s/ U2 W
7 Q" X) Y4 X" |* W
0 E1 _+ ?6 Y( a% D; e2 ^ x但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; r. m6 ^. q6 c [% P0 m9 e
使用下面代码,对内存使用了mmap函数后:3 i2 g; f) q: @1 o. W
#include <stdio.h>
" ~( g- C, G; I" Q#include <unistd.h>
5 ]+ ~: _& ~+ C& \' @" _. }#include <sys/mman.h>
# \, L- t6 @, O* ]0 q; ^#include <sys/types.h>! k2 G0 S- @ I. h& V m1 E
#include <fcntl.h>
- h" J; D b; J$ H, h& }" t, {0 }0 C' x6 m8 Y1 s4 p1 d$ i( ]8 g! l
#define SHAER_RAM_BASE_ADDR (0x80000000)# Y: a9 p+ `/ U, V+ t5 r
#define SHAER_RAM_SIZE (0x20000)
( Y3 o4 k) _# Z0 I2 s6 j* ~9 y" M
typedef struct
6 u# H' |7 R2 h! w3 ^{
3 n. ~/ E' w* \# i0 m* [& [ unsigned int a;% s; e( a( j( r
unsigned int b;; x( A D: v1 i% G' ^
unsigned int packet_cout;: D! v" ~) g2 {4 D; ]: n7 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) x" T; T( F: o. v8 o0 P* n$ m% Y$ S
void read_MSG_buffer(int *baseaddr);
4 j3 h* U7 ?8 h Y3 Kunsigned int count_copy = 0;
* G' g# }; b9 m9 G. h' }+ ?: ]
8 T! H9 P9 b$ |( |/ Uint main()
' P P0 c& r d{
1 H, G- J! \9 B# Q7 j int fd;
- s T' |" A: L( r q5 b" _* [- } int *mem = NULL;* g9 l8 S% x' A9 V, j8 k$ C# p
# R$ H# K5 `2 e/ Y7 m; h if((fd = open("/dev/mem", O_RDWR)) <0)! o3 C6 O2 H/ Q4 Z* D t
{, J" x( S) P8 X
perror("open error");) K0 m8 O9 \9 r% X/ ^
return -1;
4 }5 N) G0 \( f1 ?3 Z9 I/ @9 _" j }
: X1 B3 ~- A9 E z" a2 R; r+ a( N0 j
# o* r4 p6 R. C/ \% Q4 L mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, Q7 e. o9 {* c+ |
! m# t" x5 @, p7 Z M& y0 h while(1)! q- L+ H/ a2 r4 J" y
{0 p3 z+ v+ H M# e1 B( f
read_MSG_buffer(mem);
4 I2 e7 i/ x6 Z% W. _% L }
' `. T+ z. f0 [}
9 p8 M- S! `. }4 H5 q/ `2 A% A! L4 t
void read_MSG_buffer(int *baseaddr)5 g$ b* G3 e4 \$ ]% l) d# W
{
5 h. i Y5 t- u/ k. N pRX_MSG_PROTOCOL pshreRAM = NULL;
. L3 U, i, p Q4 E: _ D$ t4 J/ K, X8 M* Y4 \& [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 i6 m" R9 W/ X. H" f0 `
# \& t% K# ]8 V* l" s6 q& n, `4 ` if(pshreRAM->packet_cout != count_copy)
+ y1 Y7 y& l3 I/ b2 I! E+ s {
4 k) f' [. T8 P" d2 R5 [ printf("a is %d\n", pshreRAM->a);' t' s/ e, c# |' N5 q* Z$ ^
printf("b is %d\n", pshreRAM->b);
* g$ H- c+ n; I! h6 U! z printf("count is %d\n", pshreRAM->packet_cout);0 h+ d' |& D/ E
count_copy = pshreRAM->packet_cout;
0 c3 N+ w2 ?: l }' k+ A( V4 }/ G1 w- t/ Z
else! K, ^3 a* ^$ W2 W
{
J1 v7 h- l8 ~ O- L' j printf("No effective message!\n");
; C7 }: m( Q* C9 P# Q6 I" l" @- ` }( c7 S8 Z4 S4 ^1 x4 Z0 N
}' `% u, Y- t& j% g' a
! B9 P0 X4 w2 M- W' W$ M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" }) V9 i3 F7 i" a( a7 R, `" z8 @7 {1 L( `
5 g/ \8 g& H [) l
; }2 a) `0 F; B. m9 {" [ x
9 }) _; b+ C5 K( u4 W
|
|