|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 D& i% M& G& v$ J8 V: `2 E
# u& |# k5 h+ n5 x6 ^OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ N" Q8 a/ l, }- F- A% _) H#include <unistd.h>* K" Z' X$ d. ^' m& V1 m6 p# C$ u3 ]
#include <sys/mman.h>3 B) E+ n3 k& Y; w* u% e5 _1 K
#include <sys/types.h>$ _( p; E* f- _2 s
#include <fcntl.h>. Z g" m, r/ a! Y7 i* \0 E
, i3 F. ^7 X: _
#define SHAER_RAM_BASE_ADDR (0x80000000)
! u e8 @1 \1 B. W3 r9 k
; _ _5 I& h8 Y6 }6 rtypedef struct
+ U( F# ~; H$ g) \ z3 {{* z. f! Z8 v; R9 w1 _) @
unsigned int a;
% D; ]1 Y. { f% F r6 C+ L unsigned int b;7 y0 |5 I' u$ e5 K, K9 E
unsigned int packet_cout;2 \- }& c: u3 m: ~! S9 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! O7 L% X3 \# ]$ j( i
- n' m$ e8 W' w) @- X! P2 vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ m2 o2 y9 m# w4 z) B' q2 Y# x/ Zunsigned int count_copy = 0;
: @ Z0 h$ q$ n4 l
! _5 @( E; E Y, T5 l, z, l
& J7 G& s6 `6 t8 x, l' N& G' oint main()
' s6 U& S3 y& C4 _& y{
, R' ~! ~9 b( Z% }: s3 i& t pRX_MSG_PROTOCOL pshreRAM = NULL;
N3 m3 C. J+ ?5 ~) I0 e pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! U% J& O" J$ T0 m1 s- J. W% R# z1 r4 g4 s2 i
while(1)+ w- p9 K; \9 }2 {4 U
{: G L5 c$ ~/ y) G
read_MSG_buffer(pshreRAM);
, t! A6 |; `* F# g5 e }
4 |# f2 m! ?# a}( M) ?2 h! M4 k2 J
; B# j% ]! w. @- s0 R) W( u7 m) q% R$ r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- i) E5 Y# M2 t; m2 `{5 w+ u$ Y8 q+ V* f! L& X
RX_MSG_PROTOCOL buf;7 _7 M# t0 \; S; _! g) p
& B; o* G) g# t3 j7 Y+ j
buf.a = pshreRAM->a;
! S3 |' t4 F7 l) x buf.b = pshreRAM->b;
% z4 ?9 \! k* F! _, t" O buf.packet_cout = pshreRAM->packet_cout;7 g5 ?4 K# u+ e. }1 h2 ^
5 X5 q4 U& @# p- C) N
if(buf.packet_cout != count_copy)
3 u" P! b3 v+ q! Z. P) E0 q1 Q4 t {
; k7 J0 W" U7 W0 e; h2 X" E* y printf("a is %d\n", buf.a);
. g% V/ i6 n* ]$ V- L( f: l printf("b is %d\n", buf.b);
, F8 L9 G! g5 i0 M( ^7 M9 ^ printf("count is %d\n", buf.packet_cout);, R K0 r8 S- T, J8 F1 N5 K4 T
count_copy = buf.packet_cout;% U# D/ K+ K) w- Y F
}
% u6 F( m1 g: Z7 `4 ^5 | else
+ c/ l! R- n8 P( L$ \ d k {
! t( B; Z# V h) Z2 J printf("No effective message!");
: m$ Z* B. |/ C* J( { }' @2 x8 {) M* c
}
8 ~7 A" c5 |6 S' _9 y) |' y: t% e4 b! M4 p
& {$ Z) K% R* M" O) l4 H) |) @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
^+ D7 Q8 X% Y使用下面代码,对内存使用了mmap函数后:
4 Q8 m9 ]+ l9 U4 r- n" T#include <stdio.h>
( O# P, I, z2 R. p#include <unistd.h>
~7 h$ t. D4 R) R/ K r2 m#include <sys/mman.h>/ m& X, u( T8 i( j$ s8 {
#include <sys/types.h>( `/ i# c' [# k
#include <fcntl.h>
. r, K3 }( d: [; D, [0 V- T6 S2 ~1 \" z# X/ ^8 y/ X
#define SHAER_RAM_BASE_ADDR (0x80000000)7 L3 g; E5 H, Q8 o* [7 g5 v
#define SHAER_RAM_SIZE (0x20000) - R% b1 c# L& k C& z& K# b
4 u5 d2 S7 A& y7 m. i3 S/ X
typedef struct- W1 D) A- ~4 g7 g: `, Y
{
! }% o" D+ L9 n( u t4 p unsigned int a;
- E& y% N+ F5 H5 ^ unsigned int b;
+ I4 e/ C+ C- w unsigned int packet_cout;
! I6 Y. A# O) z4 ]! O& Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 r. \) V9 _6 A6 d+ z5 W+ C2 Q( V) @7 i$ _7 A! k
void read_MSG_buffer(int *baseaddr);
& D# L- V" r0 @unsigned int count_copy = 0;
& h: a5 o& z2 U6 l
' Y5 W' z0 z3 m4 p2 Aint main() B+ g2 B. }' K$ ^( Q
{
5 {. z' g! O, r2 i6 M int fd;
+ Q& {: n; w, S int *mem = NULL;9 ]9 ~: A& j7 @2 o3 `- Q
* D' r# |$ ]8 [
if((fd = open("/dev/mem", O_RDWR)) <0)6 P0 g/ I/ b, I6 c/ g- H# a
{
. Z9 j; V8 _$ b, @8 a8 E2 x/ y perror("open error");- g% w/ v8 D8 ?! t, @
return -1;
- V, W1 w2 |3 u( G }
. ~4 J+ [' r& z+ a8 K - n& [: [% S1 q2 D" k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' t* V& F( k1 z& f o+ G
1 T4 u- O% G. j, S$ x: Z
while(1)
, l& \0 F0 f. T7 n0 M {" X% l8 t; l ^/ `! X% [8 t
read_MSG_buffer(mem);
9 C* R# n! L) X ` E, ~/ W }
/ Y. o, S' `. S& s}2 _+ M% ?) @) h, P7 k* Z& z# ^
# ^& B* F, X- r, g1 M s p
void read_MSG_buffer(int *baseaddr)
/ T6 g1 W$ Z2 D, x. i0 [! V- k: [{
( j: x W2 x) U0 j/ P0 m$ Z pRX_MSG_PROTOCOL pshreRAM = NULL;
: w- `9 W9 h2 s
7 X1 o# _& H3 a$ d6 s8 K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; [8 F+ W5 E% I! |+ y
, w, g3 I& z' n2 g if(pshreRAM->packet_cout != count_copy)# s% K3 w8 b2 M& J7 R* i- F4 A
{% U$ Y/ O5 g: _
printf("a is %d\n", pshreRAM->a);6 g& o9 z S0 X/ L- a% y
printf("b is %d\n", pshreRAM->b);1 o) e5 q- I* L' u4 J) {
printf("count is %d\n", pshreRAM->packet_cout);2 S! F& J0 n9 d- r3 U1 P; t
count_copy = pshreRAM->packet_cout;1 B, {3 \4 T9 e( Z& y( \
}) Z) b9 ?8 k. j) B
else
/ \9 u- q" e2 D# b% g {7 ~. E1 S' X3 u& @, u0 V
printf("No effective message!\n");8 _# }4 g1 J5 V- g* Y9 D
}
; l% ]8 J5 d9 f: c* r, E$ O}- J" C1 y. p; U4 Z+ B& f
. L6 j& ^* s& t; S# \
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 `& f5 R: k; h% y. J" n& o B" V; R
V6 h! J0 @ w) S+ {3 ^1 l( E$ j
7 C& |3 x( v9 N
, ]; e( o; N! l) q' @: @ |
|