|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # g. c) K, ]8 K/ s& \
2 M/ S# R' A) j: _+ L1 q9 N# i3 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h> k$ |0 j. n9 I$ n
#include <unistd.h>
% e4 {) v" e* ~ l#include <sys/mman.h>$ h2 R6 o' n3 A2 |. `
#include <sys/types.h> g( k; v* j5 K( j* ~. y
#include <fcntl.h>
; t% x8 S Y% {0 \; F5 F
. o y2 `% B: B5 E$ q#define SHAER_RAM_BASE_ADDR (0x80000000) 5 Z4 Q& E+ m2 B! R( m& A' g6 N
4 y) `; U! ?- ?! x% F
typedef struct% X0 j$ [+ h) K
{ Z8 P- q$ Z" I9 u. m% D3 t. x
unsigned int a;7 g! z6 v( V" Y
unsigned int b;
+ d. u& X1 e0 R' L unsigned int packet_cout;+ _, Y7 L( ?% d8 N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 V) y. p7 t& ^/ U' r p g
* R, N# d- R3 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 d3 P5 D9 t# J8 n$ Z
unsigned int count_copy = 0;) D& @! ~8 x* l! T9 ]
7 _4 t3 `% `9 |, S/ l( h8 R
2 s% }, h1 n0 J9 O* y1 \; y) qint main()
; Q) {# [/ K w0 t7 _! L8 Y{
2 o0 E$ W2 p& u8 Z pRX_MSG_PROTOCOL pshreRAM = NULL;
! C& g5 |# K3 `. u pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* c' Y1 U/ k9 |# G! t4 y- h
3 y) n( @8 s' f/ ]1 R3 W while(1); d7 x$ _/ m# _" u, G& s
{. r8 n4 M, _: V/ B/ I2 H
read_MSG_buffer(pshreRAM);7 a5 q7 z6 E( Z) X! \
} * M% X* D5 o3 j; V
}
9 |2 k- b8 k# o# h- o
2 G1 ~+ x: F- v! w& T9 J- H# I# B+ L4 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), V; V% h% ~1 P7 D
{5 f; y2 v$ c) A' G. W& q0 K; y/ I
RX_MSG_PROTOCOL buf;3 g5 y4 C v. g6 u. n
$ E4 s9 P6 J8 ?0 e3 x' G( ?8 Q7 C buf.a = pshreRAM->a;
% Z* h) m# P4 {. N' Y' } buf.b = pshreRAM->b;" e+ V4 b$ Z4 S# u9 ~0 z
buf.packet_cout = pshreRAM->packet_cout;! c% o; N* L' H' X; p2 g
. X* P, n, z4 |5 i; w if(buf.packet_cout != count_copy)( h: `/ ^& p/ e
{! q* P: s' d' t, C$ e0 l
printf("a is %d\n", buf.a);/ b2 y& G& ?. A
printf("b is %d\n", buf.b);9 d1 t# G& N) Q& W; A
printf("count is %d\n", buf.packet_cout);# g6 U$ Z. a' ?0 S" z5 A
count_copy = buf.packet_cout;
, H7 z: I: O: l: ~2 w7 ^ }; u) H- A, e' I! J' \
else/ G1 v6 n2 O9 A. P. t
{
8 Y+ |1 Z/ p7 P, o: O: D printf("No effective message!");
. E$ M' Q) w' L9 J# X5 f }* A6 a3 s' F1 H3 o$ o% a# }/ A
}9 }5 N. t3 U2 u( f, E% s9 O) H, ]
& p: n9 ~. D5 a* m
4 v m% P& P+ J3 F: d3 f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( X& N/ x8 E: T7 \使用下面代码,对内存使用了mmap函数后:
& r. c7 Z' c5 I; `2 b- ?: @#include <stdio.h>1 p2 j. R8 O2 L# @
#include <unistd.h>
* F3 r: r6 a7 O4 J#include <sys/mman.h>
2 Y. } O+ X3 }; Y" W6 Q; l#include <sys/types.h>) L5 Q6 w) y6 ?2 Q
#include <fcntl.h>
( @, c$ H" U" Y3 s; F6 b# [
( Q; M! H$ ^3 w) J#define SHAER_RAM_BASE_ADDR (0x80000000)4 o6 ?5 L \9 i: v. J1 s
#define SHAER_RAM_SIZE (0x20000)
3 z7 A2 I' n. S' [, u; @3 P$ e
. t. G* ^. ` ]# p4 @! Ttypedef struct
! I1 c1 j; x7 s: U3 X- Y3 V- q- @( i{3 ]( d$ ?! s2 X/ ?( ~
unsigned int a;# b0 u5 f7 k' p1 p- h$ K& J
unsigned int b;
4 {: {/ Y1 _( v) b/ h unsigned int packet_cout;
0 M; p! q) S/ T( w" ]% d0 F6 R5 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ ~; U* d* d1 T1 [
- s; m8 O( ^1 m, y, f; y+ ovoid read_MSG_buffer(int *baseaddr);0 m0 L# K9 H3 H, K
unsigned int count_copy = 0;0 T0 ?5 Y; |. g8 |8 M3 x& l
1 Z o/ E: K' Q- J
int main()
% ]) E6 w9 p1 b: }% y6 Q{! v8 [( V/ K4 O- N, a
int fd;% Z; M' \7 L2 h7 h+ w
int *mem = NULL;' H: P/ | |! ]
{3 ~. N9 \4 n
if((fd = open("/dev/mem", O_RDWR)) <0)
1 r1 t2 X/ `' u1 n: g( H1 D {9 H( } x9 n! @6 ~5 J
perror("open error");
+ b7 T: ~$ \5 L" m+ m return -1;
Z W# w9 \) S4 m2 O( w; [% { Y }& q8 _6 F/ H/ f. u
, z- p& C i3 W0 `: L( k mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 E2 z; t9 {# i# x1 r) e& a+ v6 k
: P1 m6 `9 j) b9 {4 N* @. l while(1)
& m; u% I9 g u2 q0 Q) {! e& M {
3 d. w4 M/ @' Q3 ^& q: ~+ A4 X read_MSG_buffer(mem);
+ w7 t' ]7 {) z }
& T% w6 x# N7 _% X7 g. k, k}
! G4 v0 K# a9 P# A1 ?; ^
$ g( H6 r& T+ Yvoid read_MSG_buffer(int *baseaddr)1 t' \- E# \- A) L& q9 V( W7 j
{5 G! T+ H) k8 I) P* e1 m5 y
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 L0 T2 z) d7 e5 v' r c) k4 m5 r4 j/ H: W; D
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. {1 I8 s2 }5 {% y9 g4 l. y3 _* V
0 f( ]) x. w" O; E3 T' n* z2 i: G* q6 s
if(pshreRAM->packet_cout != count_copy)
* J* B/ ]2 e) P8 T5 ?# D {
: R$ r) A) F* R printf("a is %d\n", pshreRAM->a);
- |6 [& D) |( I, B2 n+ ~ y' d printf("b is %d\n", pshreRAM->b);
) Q' ]+ j& `. O k0 s- [ printf("count is %d\n", pshreRAM->packet_cout);
/ Y6 \6 a+ }% b. {( M4 K. i count_copy = pshreRAM->packet_cout;/ ?( o$ J( U% n/ I( O, T
}
0 F/ X$ q; b- v7 a$ k/ h% f5 e. U else
) `7 F; S3 Y3 d4 e2 `, g {3 @0 F! S! Y+ e, C0 F( p
printf("No effective message!\n");
- ?6 G+ L% I: F, d }) z7 y6 Q' C8 C* M
}% h2 A( f1 S2 W- T4 v$ d* O
# a! I5 N7 K- r0 K9 ~% X
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& T( _* e# e, ~
. k/ A$ r+ t% n4 c0 k! M
- B3 e' r" j/ Z* p3 N
5 S3 S8 f4 ]$ b3 {2 o4 @0 z; D
# H0 g$ p3 T; J0 O |
|