|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ ?) u3 r- X7 E2 o3 S: M9 t5 F% ~
/ m+ G" f8 g6 |7 L/ B$ N9 `
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ v. }% g% Q% g% V* P
#include <unistd.h>
( W7 W% h: J) v4 R8 F: ?# }#include <sys/mman.h>
. G: @) o& m, `; N1 g#include <sys/types.h>
0 J) v+ u# u+ p#include <fcntl.h>
( C# F8 F! C. F7 R
& y, K! d! l6 y2 l* g% K; k#define SHAER_RAM_BASE_ADDR (0x80000000)
{3 c7 j5 w6 s0 z- u+ C
q4 j- {% P/ a2 B! \0 U5 {2 Ztypedef struct0 |0 e+ h, { y; Z+ E9 V
{
! G3 L: U- x7 Z unsigned int a;$ W7 |/ ?: q( I: i# A) R$ t
unsigned int b;
) j- {" @0 \- ?. E unsigned int packet_cout;5 L. ^$ [% Z$ z, l" T' y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 [( v, x. d5 t) E. y" Q$ I
( I/ a1 ^- I. T& \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: G' A- r* L$ u
unsigned int count_copy = 0;
# d7 V! t+ k1 k5 Z( ~. o3 r; S8 q6 a
& }) E" y" z% }2 V& {int main()# a/ v: X# B# l$ L. S
{5 w% Z9 y, G6 w
pRX_MSG_PROTOCOL pshreRAM = NULL;: y/ M6 ^4 o# A, l; ?5 ?& @ W6 [
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ B, |* l' j7 C6 }5 O
" F5 K# s M; u5 |, F
while(1)
) X3 l$ _4 ] T- v$ o {# Q( `0 e3 F; {+ M
read_MSG_buffer(pshreRAM);+ W# L2 k: T2 B9 b
} ' R7 `/ J4 s8 E9 W* B+ h# C
}
1 N# u! b9 w# g3 n4 z6 V$ }4 `* e1 s W$ f; V1 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) j9 H/ G- [ R{6 c- o# k& L4 n- c% G7 |) Z
RX_MSG_PROTOCOL buf;
V- W, O% s' ^& e $ {8 a1 I' f$ t3 n$ E) r$ M
buf.a = pshreRAM->a;$ m# t1 j5 @2 F# a2 r% X' l4 Y
buf.b = pshreRAM->b;
' I; O" \; u9 v' b6 \2 W4 \ buf.packet_cout = pshreRAM->packet_cout;
" R. i, U6 b' I9 N4 w
" k: w3 D+ k% r# i if(buf.packet_cout != count_copy)
4 U+ ^6 a/ w0 {& Q' o/ ?# w0 n; f {
$ s; N7 m% K3 f1 A' _$ {8 I# b, a* R! V printf("a is %d\n", buf.a);
' b' O- V2 l0 R6 x& _ printf("b is %d\n", buf.b);
& _+ d( V" ~/ @7 L printf("count is %d\n", buf.packet_cout);
9 I# N7 n! w% }6 b, n count_copy = buf.packet_cout;
9 H" Z+ A: C, ^+ y }# P3 N/ Z7 b/ \+ x O j8 u4 c
else6 i8 a- e$ O, ?9 d! I; i: Z5 `
{! `# y7 ~7 c/ F) U8 T' y. Q
printf("No effective message!");' \/ T6 G7 W1 N* ^
}& x4 g/ S/ V, v8 q% K# ^" F
}1 c* [6 o" A8 C- d
* n3 j/ G0 C6 T; e" \) K
. R# h& E& k0 E4 k; v但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ c+ }; [* m' E1 `
使用下面代码,对内存使用了mmap函数后:* h; y, R' H5 j3 C7 I [' {" ]4 C
#include <stdio.h>
) ]6 K; L% R7 _ b#include <unistd.h>
) U- A; M+ h2 h#include <sys/mman.h>: a' t* F# U) b1 k( k6 u) y
#include <sys/types.h>
" _ }/ ~& M% E& F#include <fcntl.h>* b6 Y z- x( [; A# Z' e" E5 @$ O: d* |
. k" j% j' A) ?#define SHAER_RAM_BASE_ADDR (0x80000000)
$ {: i* N5 u: p. j: F#define SHAER_RAM_SIZE (0x20000)
% ^. A; R# T3 o% J
/ Z/ O1 ~) K5 B* B3 qtypedef struct
. |$ y8 L5 z' ~6 B, W. r/ p{
: j0 O7 C. n" J% R7 Q unsigned int a;" p. M2 u$ U' I1 G: K
unsigned int b;8 H5 Y' P% @9 O' a1 A
unsigned int packet_cout;
0 }: e' g+ @( a6 N* s3 {# [& l K: L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, ^* _5 W! i0 W( X" q' B
" N/ w; A* G: x7 z( }; q6 r! Rvoid read_MSG_buffer(int *baseaddr);9 p7 n7 P2 c4 [$ n+ [3 k
unsigned int count_copy = 0;
$ ?. D [6 b! S( h. c* t- F! M, s1 \" d. F2 p$ G
int main(): ]0 r& |0 z, \ V" D" R
{
1 \7 b8 A" [% m6 N- r7 a' T int fd;
5 E( r& t8 Y s* [% l int *mem = NULL;
8 ]3 f% A; V& M2 i" _1 F% L: @# W! P& G6 u: t9 Q3 F3 `
if((fd = open("/dev/mem", O_RDWR)) <0)
0 _( h. p( m# ~ {, j% _" B* H0 ?. ~6 n6 Y/ e
perror("open error");! T. H R$ F! e1 p* H, _9 ^
return -1;
; c! e: ~+ l+ _8 d3 I2 o }0 x5 g& y Y; j8 Q# u$ w L; ^: \9 N0 n
7 \ Q$ t- Q1 w, [0 C2 K mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, j6 R% M2 Q4 e
$ q c5 p! E5 X while(1)# x' @7 {4 x6 L' F7 Q6 v, h
{: M; g7 V. g* e
read_MSG_buffer(mem);) C/ U6 B6 m6 t# F" Q
}
. V1 j: N) Y) ~$ p; j3 S* U( N}$ w5 g) o0 P3 M7 E
# q# U2 c4 H6 [- o1 cvoid read_MSG_buffer(int *baseaddr)
6 [1 e; H* b& k8 M8 x& b{
0 s: ^$ }5 z! J4 W! @7 V- X5 w9 w pRX_MSG_PROTOCOL pshreRAM = NULL;
8 C" {! y4 x8 f& a" x( m2 f9 X) V; N* d. N( r2 @, C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 H( }9 L+ }: q+ Z' u+ V, J+ s
- q! M! C( b, B" ]" Z if(pshreRAM->packet_cout != count_copy)) E1 q7 v8 _. e' I/ h6 p
{& k3 `) S8 P3 x1 j" F8 T; g
printf("a is %d\n", pshreRAM->a);
+ c8 {- z, ^0 ^: b printf("b is %d\n", pshreRAM->b);
; G) Q+ m% @* F) f printf("count is %d\n", pshreRAM->packet_cout);. j4 u" i& v0 x+ b" |4 w
count_copy = pshreRAM->packet_cout;! K" `* b9 o$ h" j3 y' ?( [$ J
}; c% R" y. ~/ w3 J0 H- a
else
) O+ t/ y8 ?% |+ Z {
( R3 b( q; C. [9 }3 e printf("No effective message!\n");
' n& w4 E! h; y r2 u/ Y }
& q2 d c" r( c8 ]}
" w5 N, X4 Z- q ]$ h+ U. L. _
/ ^+ F9 ?3 b7 D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 P8 m2 P+ @) _8 f# e( D
/ t9 W5 f$ U3 D6 q
# H/ p6 g# s8 l! x& n& M! v/ m7 |( ~: q q2 w
- Q7 Q% ~7 D% S: d/ m+ Q, Y# |# W |
|