|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . b8 X7 U G6 M) E. q5 e r
4 s4 ~5 a7 p5 W, d0 I) tOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) ^/ d% S0 T6 F. q7 p' a4 c
#include <unistd.h>
, X4 l% L3 W! Y/ G#include <sys/mman.h>
: _ Z( M1 N3 p#include <sys/types.h>. m3 B G2 K! J/ \4 g- t7 P
#include <fcntl.h>4 T' I- w1 u( y& t
& r1 d$ C+ P8 o6 j
#define SHAER_RAM_BASE_ADDR (0x80000000) # h* E: t6 N+ w; C% d, e5 m
& z; t! m3 F3 y; I, j
typedef struct9 U; a2 e) W% P1 ^, ]+ A3 t* @
{6 E& j" X, s5 O+ e; P& N' h
unsigned int a;% ?9 u1 d7 b% k0 V
unsigned int b;6 t1 a( P, S0 H% B" M
unsigned int packet_cout;: P! K' x* W6 _, l5 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ?6 u- i+ Z' \" [6 x7 B
/ y) `4 Y( x) }6 m4 mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 A v- W# m/ p9 i+ @9 O* X$ bunsigned int count_copy = 0;3 s6 O* E0 f9 W5 I, n, H/ _ \
1 E- ^/ L2 W, ?, C- z7 P! v" Y8 b
) t. M8 t* ^+ a4 C* n9 ^int main()
4 E- [; V3 ?% q8 @8 f0 L3 h( I{
7 h4 m- J; D" p pRX_MSG_PROTOCOL pshreRAM = NULL;
^$ g; N% y+ ? pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 I4 e' r2 a6 A4 M( p4 g2 `$ S# O+ J5 w: ~
while(1)
* G4 A* q+ v6 D {, W1 P- c* z5 F1 ~0 [
read_MSG_buffer(pshreRAM);
5 Z" y- n% W, b: r }
' p# a3 K8 Z# x6 E}, e H; v/ E; F+ P! W
0 D7 R; ` O' F5 p& L* E. Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" ]4 `) W3 @/ o4 ~{1 W; W4 s3 X" c" N7 ]2 X8 V) Y
RX_MSG_PROTOCOL buf;
0 i; v3 q% B7 ]* V1 G& Y
2 _5 M# S6 e6 p buf.a = pshreRAM->a;( ^1 ]5 Q$ {+ ? ]3 \ y9 P
buf.b = pshreRAM->b;& W+ P: T2 B" c0 X. s9 s1 ` n
buf.packet_cout = pshreRAM->packet_cout; Z6 ?" W- w; C
3 \1 x0 n& R0 `, i
if(buf.packet_cout != count_copy)
; R* [7 i' w3 I! f, ?6 G {
2 d: z. X/ C( h! ?$ L; U printf("a is %d\n", buf.a);
1 U8 W2 h5 Z! ^+ G printf("b is %d\n", buf.b);
3 v: {1 ~ [8 A7 [ printf("count is %d\n", buf.packet_cout);
2 b9 s2 B: H& _4 p8 m( s( P* V& r4 [ count_copy = buf.packet_cout;
* Q" n8 h5 {( E }- z) `+ K3 y+ X }
, l/ {" L0 i8 D else
. I8 i1 B$ A! ]* y/ Q$ k0 E {
& z! h' z- X- a5 e" T7 i printf("No effective message!");6 Q2 T" K' o7 o7 j' A
}8 y }# o- T3 Z! @! T0 v, ^
}" Q' a+ h7 U& p% a" E5 u
7 B0 d6 |5 K6 T" M
, f" f- @1 X2 n- X8 q! k/ c但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ Q" s! X4 f4 O使用下面代码,对内存使用了mmap函数后:! y+ l$ {# Q6 }; Y' y4 G Y
#include <stdio.h>+ g& N) E: \# D7 M% G( R
#include <unistd.h>: h. N! |% H/ g( F8 `
#include <sys/mman.h>
, X, z" o" j/ W" j#include <sys/types.h>) _9 _' ~5 ~* {
#include <fcntl.h>5 |/ b: E- t a) [
8 A& V9 i, K9 T" o* p0 F& y
#define SHAER_RAM_BASE_ADDR (0x80000000)" q/ ?+ T5 L4 Y6 Z; q
#define SHAER_RAM_SIZE (0x20000) 4 R" d+ q0 Y) w$ o( [& `; L
0 m- Z4 e4 a! Ztypedef struct
0 m# x' V+ k, k{# G% G0 v4 w9 \9 u. g. Q" b1 S9 u
unsigned int a;' w0 v5 H4 a- D; d ?7 j
unsigned int b;. u$ a) k' F# H) u6 d
unsigned int packet_cout;
3 [( E7 G4 n J5 W/ h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ]5 ]* S3 q" z! w) d% o# H# e0 C, f, J9 ^' S
void read_MSG_buffer(int *baseaddr);
) F- X# l9 t7 Vunsigned int count_copy = 0;5 M8 m% T8 u3 `' P# j5 o
7 X! `+ L& a' v" }& u
int main()
8 d# i# E$ V0 M* Q4 T/ r{" c/ i; d, x( ~: `+ Q9 F) ?' d
int fd;
# j0 z% [9 M* x# [7 v$ a" ^4 M5 Z) W int *mem = NULL;
6 U* d6 X9 w& [1 b. h3 o A
. {/ b& r! `' |( _0 p1 j7 }& u if((fd = open("/dev/mem", O_RDWR)) <0). K9 h5 H0 P8 ^; U) t% s* I
{
( K# f( L8 n8 k' C) ?3 b perror("open error");
8 B- v9 W+ N J8 y, ?3 e return -1;
* y$ i2 _; i1 t# p6 [. _" n }
, y& t2 `6 a7 r( ^. Z) d
0 L. P2 b1 I: Q/ } mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 ~2 f4 ~% r( S: }2 \- X
( I; r. j' ~9 I4 K5 K* l' x
while(1)- F' Y* V& }2 f( H/ A* n* a3 ?
{7 W2 W {/ d5 q7 o c: v! H! Z
read_MSG_buffer(mem);
" p" y9 X R* q }
* t& q) `$ F) j$ h3 A$ H( i}
# F' {' r& v2 z" ~
) F; @: q$ J6 lvoid read_MSG_buffer(int *baseaddr)
, C+ ]( |4 s2 L# v{
5 D4 }0 T1 y# D! A pRX_MSG_PROTOCOL pshreRAM = NULL;
; }* @$ F. G( L2 k! o: g2 y" }! _+ v/ |* ]5 h( {
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;% Z) l. p9 A6 E+ r
" ~8 h% W! n9 j* h4 z
if(pshreRAM->packet_cout != count_copy)$ V0 ~; ]5 K% d# `$ S0 {
{8 I1 u* B7 t( f- w+ ]' Y
printf("a is %d\n", pshreRAM->a);- ~6 v( d+ _# I# J4 I8 ^7 r
printf("b is %d\n", pshreRAM->b);9 c8 c; z+ X9 i+ S" F/ T3 Y
printf("count is %d\n", pshreRAM->packet_cout);5 m# B$ a5 i% e
count_copy = pshreRAM->packet_cout;
2 U6 C, q& [* r# M' |, P- c }
5 v1 Z/ z% S0 c5 v$ H& M else1 B( B. E8 I9 c1 M/ Q; F: x
{
1 G& q- |# q& s5 F+ L( N printf("No effective message!\n");
3 n! H' _" {- ^; F6 P* l }
% h/ ^1 K! \0 Q' w" g3 m- R8 O$ V# P}
: g3 ?9 R; F8 [4 }' m
8 W. V! P8 {8 \" n- i0 e8 {没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& P: I1 E: g! t
8 U$ u/ X2 K; a
3 Z- t+ M8 K# j0 d7 S
8 B5 L/ z3 N- n; d# ~- w8 u% D1 ]* q; Z; e5 o0 `- b+ m
|
|