|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 q* G) G: ]9 q3 G @) l
) I7 c! ~5 Y/ Q9 m0 q* r2 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; E4 A+ W& h* u3 r2 L& `#include <unistd.h>( ~2 y E2 g5 e$ [- g% |0 c3 Z
#include <sys/mman.h>2 W" G5 k: H3 o% R* u, Q
#include <sys/types.h>7 V* M; \- Y; c; I, i j0 S
#include <fcntl.h>8 ]. _1 F2 u3 Z/ N5 F/ o @! E
' }/ e3 j, k4 Y#define SHAER_RAM_BASE_ADDR (0x80000000) 3 @0 V. ^2 C3 S8 F" T1 \9 E
$ U2 a7 W/ N5 {
typedef struct
5 U: k8 o9 I" U6 Z( n$ h& m* f. ?$ g* P- w{
8 H \+ k- V( n- q+ n. D) x" f unsigned int a;3 H# [) n# @9 B a6 h0 L: ^) H S
unsigned int b;' i- K1 a" |$ V; U7 I4 T
unsigned int packet_cout;1 ^ L2 i+ g P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ?' K2 I: Z( Y- r# f/ R* S; E0 F; K: _
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# S+ S& r2 I* p5 @unsigned int count_copy = 0;' E9 g( Y7 T, u% f
, H4 r, M% d$ ], r: R
; ^6 y0 z7 r5 M) f- f" R, rint main()5 W% U! F; j5 h! W2 @2 A
{6 G" ^* k; `/ p0 y% \- T' _1 p5 A
pRX_MSG_PROTOCOL pshreRAM = NULL;- O. u, d1 x* A' P* e3 h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 E9 I1 P# @9 c9 W- D6 g1 b t6 b9 V( |; h! ?( Z$ h) u2 u& _
while(1)3 d0 @+ }$ R: n0 T4 M( _
{
. X+ c$ _1 r: | read_MSG_buffer(pshreRAM);
/ \$ o. Z8 @( B) _; @+ x }
, t; C& I% L, p2 w! I( ]}
# i, U! W8 {" j: ]' l" k: n: O7 N8 {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% h) ` y% D8 [* \
{
' O7 a Y' w; s# J5 m4 ^ RX_MSG_PROTOCOL buf;8 T$ |! h. s6 k: x6 {5 {: t+ @
' G5 i0 ^+ v3 [ buf.a = pshreRAM->a;
/ ]. o B! ]- w. n buf.b = pshreRAM->b;
) R) j$ ?) x6 T; j buf.packet_cout = pshreRAM->packet_cout;& {8 V+ W0 ?0 M) F9 g
3 H$ k1 @/ X8 Z! G6 q/ f b if(buf.packet_cout != count_copy)
: @8 q: A4 W! F7 k {
p2 t9 G" [7 f+ I4 C- r6 J' w' Y printf("a is %d\n", buf.a);6 e2 u' J! \1 M3 `. Z" ^, |; M5 f
printf("b is %d\n", buf.b);
% B6 H8 Y( y |8 G/ q4 @ printf("count is %d\n", buf.packet_cout);
. g2 l3 o5 N4 w8 i+ z5 [ count_copy = buf.packet_cout;
* N' U6 S- ]4 k/ T, ?2 V6 ?/ x }
% Y: o) T, c6 p! ^) \: X6 C; {1 z else
0 }+ w& Q G# b9 l {
; t5 W, w1 {- i( o' g$ I printf("No effective message!");. t1 x% F6 R* U! U! S: V
}
9 A+ a' ?. I" m- F# [}' M+ s" O& @. L! e1 J
$ ]; x* D6 v- W* {
9 A/ g3 n. Q3 f* S+ n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 W( W& d$ j# d7 [- M! M9 ^& ~使用下面代码,对内存使用了mmap函数后:/ a2 w' m/ i: n
#include <stdio.h>8 s. h' P( X; O# w. r! j2 J
#include <unistd.h>
4 K5 h9 m3 L2 {- T$ D#include <sys/mman.h>& i2 v4 S: n7 n- y D6 R
#include <sys/types.h>
9 u' W, m8 J: t: R% Z#include <fcntl.h>
" b5 ?7 T" } `" \" ^6 p& I7 T0 O9 E( o0 I
#define SHAER_RAM_BASE_ADDR (0x80000000)% H3 P+ t* t4 ^/ `: R+ f$ N ]; q
#define SHAER_RAM_SIZE (0x20000)
( A, s* K% h4 y% l# O- |
, {8 B5 ^+ s; f1 ~typedef struct# l: c, R% F+ A. a# m
{% ^( K* P; Y$ s7 ?
unsigned int a; |; _* W2 U7 q0 Q3 ~% E
unsigned int b;9 s: F, }( N3 J* Q& e
unsigned int packet_cout;' I. h, e1 ]' p3 n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- K! {% Z. E/ ]8 [" B+ w0 v
+ L, B/ {& l6 _- |/ \2 ]
void read_MSG_buffer(int *baseaddr);
& m' X" F8 z8 R# `unsigned int count_copy = 0;
; I6 _3 `2 S( j8 u5 ?0 d
6 E# l1 I3 f9 Cint main()- a/ V1 Y; {# w0 a+ X6 Q- I- V- x
{
" A# E; r, N$ T0 e/ ?5 S8 Q x int fd;
4 n" G; C6 j0 ?9 L: m7 X int *mem = NULL;
4 A! W8 C/ }# U2 \! F
% s! Z8 T7 V+ M9 x6 p if((fd = open("/dev/mem", O_RDWR)) <0): k& A, P6 b$ N
{0 e `7 P7 y& B
perror("open error");2 z9 ^! G- E- v' I1 p6 V( }% P4 G
return -1;
! k* L9 T3 P/ O3 Y: U! P$ u }
3 u. p0 D* h) K
3 Y) F, m# ]5 P9 f mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 e, u1 p0 o4 j- I3 \# }
4 Z8 {; u( a5 a3 |
while(1)
# T9 p$ C' V; x {1 a- N) O+ B6 k U4 Z
read_MSG_buffer(mem);
4 K1 d' H/ ~) E) E } 8 {* O: z( O1 M" c0 Y
}
# C. l' _/ i/ ?; | @
# D4 W: g7 M7 g, G6 u/ `void read_MSG_buffer(int *baseaddr). O0 M0 F* l4 f9 n& W
{$ F0 R" A* O% E, j5 y1 d
pRX_MSG_PROTOCOL pshreRAM = NULL;" o% l. ?2 e5 F( e( V$ a
/ v! W2 L6 |5 t: v5 y5 @6 A3 y( K, K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% _* V9 o& S6 \2 ]6 ]
" A! n) u8 S- V( T1 X if(pshreRAM->packet_cout != count_copy)
$ ~7 v2 ^! A; D u" o {
. S+ j( g3 T0 p" e, g6 }. a7 t printf("a is %d\n", pshreRAM->a);
8 F" T% O0 S; _9 t, y0 I: X0 [ printf("b is %d\n", pshreRAM->b);
6 l7 g# G! R2 E. n* C) y% H printf("count is %d\n", pshreRAM->packet_cout);
6 _4 d+ |) S% U, O4 X3 V count_copy = pshreRAM->packet_cout;
( x* d/ d x) G4 ~+ E% R }- l' S4 g8 I" D: i
else
Z7 L) P' |0 A! ]6 t {
% E/ \/ ?, @2 g9 V, d2 i/ L printf("No effective message!\n");" _2 v% u, m! j ]
}0 M- U; S9 O& W# n/ R% B
}$ g: _$ R; `% t& J, X p7 N
, b, M' S0 X# q! Y/ Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 a* {0 v* k7 k& N! F. t2 T
' t, I0 `9 }# c" `' t3 K7 \9 b) W, J! A5 v9 H" X% M7 a
" b# \$ K5 ~7 Z5 r
" D) h7 v/ F2 J; B s# q7 l) }4 [2 l; V |
|