|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; V- p3 N. ]( |" d' r V& i4 E5 R; e( L
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ?* F! i/ Q8 N#include <unistd.h>" A# I: n W0 {; \" Y7 R) u
#include <sys/mman.h>2 m7 E O! {' R+ G$ i% @
#include <sys/types.h>
* w; L u4 b; Y; b4 |#include <fcntl.h>, w6 r7 w+ s' D. @
/ y; }% W* Y+ `! d; e
#define SHAER_RAM_BASE_ADDR (0x80000000)
~6 ]7 [- c( Y; d' g1 g- _0 V3 y$ h& T: D
typedef struct
8 j8 a4 K( w3 y6 E' l$ u: d{* w# f" K7 P# K% ~
unsigned int a;7 {: v: i0 s! D6 V
unsigned int b;
( W _0 B* t; T6 N" l* @% M unsigned int packet_cout;5 ~8 d, U) d; t! j R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 f- A7 ~! K* d
* q( y6 ~& x1 p9 `- p# i/ S7 ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); o) O$ F. O+ o7 b2 _
unsigned int count_copy = 0;- O6 C" {, r- D* d
. [0 ~6 ]% J$ a! l- ?
& c' {. H0 G3 ^4 c+ o4 cint main()5 S: q7 j/ Y( X& [& R: Y
{5 i1 ~; [ Q8 Z4 m, |
pRX_MSG_PROTOCOL pshreRAM = NULL;0 d$ r" h( y. Q) t K% M( }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
G4 {2 x( k0 \$ J! P! O
2 G3 M5 f9 a3 h+ I) h while(1)
* a1 q* k" K( g% @! `0 ~' b! y {
. l! a5 B- D. \7 T w! p( H x read_MSG_buffer(pshreRAM);/ ^5 \! `6 J! y l; |6 h
} 2 a* B, { z1 D# V
}: E7 Z9 j2 t& U$ Z
" r: \/ `0 }, b& k$ m. z& e* R7 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& D8 v& X! ]2 I/ M
{
& r8 ~" e7 B5 k* S RX_MSG_PROTOCOL buf;
' d$ U9 U" m. G7 ?$ O
" Z: U$ V2 P# @ buf.a = pshreRAM->a;
, F: F% W; S( u, l* B buf.b = pshreRAM->b;
7 e! x3 K8 Y7 @* }. f buf.packet_cout = pshreRAM->packet_cout;
" _ T; I" S* J/ M2 o4 u$ v$ A- L8 o
6 U' {0 ^, M+ w& B& o i if(buf.packet_cout != count_copy)& c) n: T5 z. w4 B3 @: _
{5 u4 ?# B+ ^6 N/ a
printf("a is %d\n", buf.a);5 [" m- o# a3 r$ K- Q [
printf("b is %d\n", buf.b);
- Z4 E/ _7 {+ F printf("count is %d\n", buf.packet_cout);
2 s& ^5 O; g4 Z( W4 T9 G* N: }5 G count_copy = buf.packet_cout;
) G p' U+ F2 `& ~' m }( C& O J. ^$ d3 d" F( s
else
0 k5 Y7 h) l3 m {
& d1 q( |' Z0 o printf("No effective message!");6 F9 O6 n/ c9 w ]
}
, I4 f& [2 A0 R}- R- V$ R5 Y4 f, ^
3 |( E# n* K* k% m6 m
. a" D( {! J- j& {但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! f/ V* h+ G5 W
使用下面代码,对内存使用了mmap函数后:, t9 m& Y0 i& V6 V
#include <stdio.h>
9 D* M' Z8 y' v- V$ i* T#include <unistd.h>
4 p- n9 ^2 x) p" O: z1 e#include <sys/mman.h>
6 H9 W/ ?( ]% P6 ~) x# W+ ?9 w#include <sys/types.h>
/ G J' Z' K, k' n( L1 X#include <fcntl.h>( o7 h& p. w" Q/ z
# Q+ @; p O# _#define SHAER_RAM_BASE_ADDR (0x80000000), a& E0 s( V7 C$ v5 ^$ Z3 U
#define SHAER_RAM_SIZE (0x20000)
) _- h2 V' v9 M2 ?$ G5 a. W1 c/ g) f1 K) k: F* _- ?. V3 g' n" J
typedef struct0 K4 \1 v4 h5 M# ? A
{
& R7 {* U+ B* ^* K& ] unsigned int a;6 a+ I, p/ e( C( o: |, ]
unsigned int b;
- x2 n1 M6 m7 ]/ C- a7 I3 o unsigned int packet_cout;
& K; l K$ ]3 b3 @& b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 G. m3 A! \, {* t- o" B/ n' C' Y* C/ V8 x7 B
void read_MSG_buffer(int *baseaddr); g8 t# w; Q2 b! S, L
unsigned int count_copy = 0;
. S( U3 j# p6 U. W! I# ?4 O+ }8 s
- d p4 O3 J9 W- \9 k# Yint main()$ [* V8 n9 h* f1 c2 R) Z$ Z: Q
{
+ R( ]2 A& N0 L1 ~/ p2 _* } int fd;$ K5 j |5 M" B$ V4 f2 q7 V8 g
int *mem = NULL;
! z" A& G2 E9 C+ r1 |0 b" A6 V$ L- c/ L" M" j- L* ^
if((fd = open("/dev/mem", O_RDWR)) <0)
, H7 @, [5 m0 }% T7 l) o! y {6 J3 l* [3 V M- I5 t4 y
perror("open error");
9 }: T: c; l/ g; Z return -1;) X" V" s/ U' C7 _2 R
}
g. r8 U( L! _5 r3 s 6 v, T& B- Y# K& D4 V, q8 ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 b& w1 g, W* M+ z; n; S
6 c' x: o# D3 o) d% u; y
while(1)0 O( l+ n( ]9 K
{: ~% ^# ~) l* a3 `9 @! t
read_MSG_buffer(mem);
5 ?5 e) q7 z ]" Y }
7 k3 R, F" r" E" K A}
9 @, k# G0 ]9 b, `* Z* y5 a
" q# z- e s P6 z$ Bvoid read_MSG_buffer(int *baseaddr)
6 h0 S6 Q$ l ?{
# O' V, Y1 P# K) C pRX_MSG_PROTOCOL pshreRAM = NULL;
8 G/ [3 U+ f1 T! w5 Y! O# b3 O7 p
* \, F1 a' B9 G% g( I# d! X# Q pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 |+ H9 B2 P* N9 b; _
5 P. I! C; w6 E; P: A if(pshreRAM->packet_cout != count_copy)9 ~# [% @& m% \! V9 ~
{$ z/ D+ G [# N; _
printf("a is %d\n", pshreRAM->a);
0 }1 j! E4 h q) ~) \; A4 Y: s printf("b is %d\n", pshreRAM->b);! x& o2 d6 n6 ?6 i* h4 \, l: Q1 B
printf("count is %d\n", pshreRAM->packet_cout);
8 U# R1 H: |) \- @) T M. ] count_copy = pshreRAM->packet_cout;
* l4 H2 @2 q q2 o: q8 h" E }
) s; F* C" L8 F else# ?7 B5 ?3 V' r/ \
{
5 m6 S4 a# R) Q- r% s printf("No effective message!\n");$ K B9 s5 \: j. f0 [, A" W u
}
' G9 B x" N# X6 R# }, n$ u}
4 M8 D: P: ]' h2 f; g1 R; u" s: `3 A; q9 h1 Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 ~8 P+ _+ i1 [; Z. S2 M) y4 Y+ a7 \3 Y' Z" s4 W. v# j! X H- j
# M) }" X. Z! W+ t2 ^
$ f5 _- s# R3 H% b5 A+ P& e% b1 m3 d0 Q1 ^
|
|