|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 w/ A6 I7 t0 ~) f0 x [2 {* E* @3 K8 U$ y: q' [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' M4 n( p; J; a( q b
#include <unistd.h>* f" i3 J' R+ v. ~( Y! S, Z
#include <sys/mman.h>( I, w9 E: X7 G& f" _; D0 F$ X: o
#include <sys/types.h>$ i. ?. c) Y% e! y8 N, {7 D9 P1 m- _
#include <fcntl.h>" `" c' V4 h+ ^% A
+ M$ ^9 B e/ I! I1 \
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ V9 D4 ]* ^+ V) _6 {/ k) z7 l# S, b/ T W% L
typedef struct& Z+ e# H) I3 @" L4 u
{
$ H4 p& ~1 J; E+ V unsigned int a;* j( H0 ~7 r) K0 L" d v3 F/ ^
unsigned int b;
8 J, D& l7 r8 X: p- s1 Q% O( F2 n unsigned int packet_cout;
6 e# M/ P' W1 W" R6 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: S2 {4 R% D) B6 I8 ~ v7 H3 |
' }# d( T Q4 P: K7 a, m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 r9 `7 B% r& L8 l$ L7 W6 }- Cunsigned int count_copy = 0;. k' @+ c/ r6 I4 a6 r
$ M3 V5 e' x4 O* ]! C1 j* i5 [
% V* ^6 Q- I7 g4 @ Rint main()
4 S8 n- r T0 D- r{
3 d: s5 F T8 @$ l pRX_MSG_PROTOCOL pshreRAM = NULL;, ]( D m& u% c1 Q0 g0 {
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! Z9 o+ Z0 [% W% K& q' K) b; v$ X# @, ^9 v8 w& x" q4 n
while(1)
0 D6 S. L9 P- C# t* _3 l- K. k4 j- K {
0 o4 P, L7 L+ g3 K7 [% S1 X7 P read_MSG_buffer(pshreRAM);/ U) F6 P) |$ i3 U
} $ [/ a3 C' \* L, V2 r
}
' n( T* ~4 f. e: W7 T' M$ W) x. y& y0 o8 H/ |/ `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# F7 b% r3 e% `4 \) i' G$ M{3 R+ O/ b$ |: o# U. F
RX_MSG_PROTOCOL buf; C) K) m6 k, u/ {
# y( F C( n8 N2 x+ T buf.a = pshreRAM->a;
* T6 K9 r" M7 ~# Q buf.b = pshreRAM->b;0 U$ M! F t% y
buf.packet_cout = pshreRAM->packet_cout;
4 ~5 R6 Q" q: X- K4 Q6 H) R& ? 3 K- D8 P7 H% P R3 o1 V" x
if(buf.packet_cout != count_copy)
( a2 ]. S8 E/ B( J3 S {
/ z0 l M- Q/ A+ w9 N; u# q printf("a is %d\n", buf.a);
0 Z2 t; w, w _8 u z printf("b is %d\n", buf.b);4 X, a6 }% h! G( W
printf("count is %d\n", buf.packet_cout);
: T3 S, i5 l3 W. B7 I F6 E4 _ count_copy = buf.packet_cout;" |9 X4 ^+ e- q( h T+ e
}8 m$ q- {1 u: y$ j" H
else+ @- }5 i ]0 J4 A0 G8 p
{
0 n) L+ W0 N5 _8 z* @ printf("No effective message!");
5 c( r+ w+ F9 l/ a }
+ a- F) `: G* \, |}2 B$ W @3 j( }8 |4 z5 j: O
. y& @5 G3 |# F$ X; T; k: P) h
8 F) O0 l7 E; O9 \6 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" x2 a9 d. p: |7 Z" z
使用下面代码,对内存使用了mmap函数后:; r* I; t: X$ _- U+ e4 B
#include <stdio.h>. c( c5 T; i- j& _9 E' @$ v
#include <unistd.h>4 X# u# X( K" O; ~, {
#include <sys/mman.h>$ Y" V8 w5 M! N7 I! J$ _
#include <sys/types.h>; D2 W9 R; X4 Z8 D( N9 s
#include <fcntl.h>
8 z4 J: @6 B/ s3 @) @. r9 k0 E$ ^9 H7 t
#define SHAER_RAM_BASE_ADDR (0x80000000)8 z9 P$ {" P4 X, V4 d
#define SHAER_RAM_SIZE (0x20000)
) B, |$ ^" z& W% I2 f2 c& ^7 P
/ r0 L3 {/ g5 x9 K3 W& }! i) Stypedef struct7 ~2 E. L# z# n8 \7 \; g& N/ o
{
5 x3 S0 R! V0 ?9 n# ]- m unsigned int a;
7 ]3 B/ B# [$ B/ d7 O unsigned int b;
2 D& m$ E. E8 Q6 K! s, i unsigned int packet_cout;0 ]6 `2 V @8 B5 [) [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 y9 P$ P) e0 k/ Z& c- C @+ X0 H6 p. e) \; S( a4 x, L
void read_MSG_buffer(int *baseaddr);
2 _! ]) W4 k# A0 s X. n7 Gunsigned int count_copy = 0;
* k, |! u o, y" s6 e+ Y
/ [, I7 @2 Y$ W& I* W* _int main()
" w3 B! ]7 W" E1 y3 r{4 r( h# x: [ T% {
int fd;, f5 L4 v+ J) ~, x
int *mem = NULL;
- ]2 s% b4 L/ n% E, C
0 [" Y1 M0 T& b6 b5 ? if((fd = open("/dev/mem", O_RDWR)) <0)2 Q/ u" S6 v4 u( W9 c0 g$ L4 x
{& q/ q# W5 j! f
perror("open error");
1 I; S/ s2 W9 V5 n return -1;0 b/ {$ w4 C2 D/ h$ {, m
}# [7 R- F% x4 @: j3 l3 f
$ a3 ]& L& ]. }6 z$ G- I$ ~' t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; a6 T0 i7 s; k* W1 j: i: L! V0 o% i& y9 j, C2 M
while(1)/ b7 R4 p# n; Y1 }5 z
{$ ~$ c- Q8 B4 E, P" C6 w
read_MSG_buffer(mem);4 e& k' u& h8 v9 Q
} 3 ^% ] f) _9 m& ~+ U6 f
}2 V! {0 z0 d R8 ~5 b9 P
& e" ?1 M9 z1 A/ q) Z
void read_MSG_buffer(int *baseaddr)) Y9 _7 ^: f9 e& h: m% O. _. i
{
# X5 ?% T0 B x pRX_MSG_PROTOCOL pshreRAM = NULL;
# ^& C; s) ]0 n! P8 q/ d
% d0 h0 U& Y/ E3 B* A1 |: _ pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 ?( f1 |9 ?- r' c1 y `
2 K# |0 H; Q" k6 c+ k" o if(pshreRAM->packet_cout != count_copy)2 O- K2 p6 b8 s; E7 B& H6 T) m" h, E; q
{& B3 m1 u# e" W% v5 R; B6 \
printf("a is %d\n", pshreRAM->a);) V' h& `: d5 }
printf("b is %d\n", pshreRAM->b);% x: Z: D' r6 Z' ^
printf("count is %d\n", pshreRAM->packet_cout);5 D! M. u0 r1 ], j- v
count_copy = pshreRAM->packet_cout; r# x- w$ k9 G& W
}
& c4 W7 U4 \+ u( ~: P! M0 S else
1 O1 ~) F* h' N; w: } {
3 H d1 M/ u/ D4 G, o- e- } printf("No effective message!\n");
u# K- _/ h, {! F) p! q& e- N+ w }( z% Q( E1 F1 n/ g* `
}( {" v, P: @& u* g. F( D4 |
) G) H( O7 Q( r2 W' v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ^2 X. t; m' ^9 j- q8 M
9 N) b5 e# A, @- X
7 C* P- Q6 C- |! o! W2 m( k, P' ]6 j' Y2 d9 O
1 y5 X% O4 h' \# T9 F# e
|
|