|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" p) e/ X$ ?6 r& B* A6 E5 i" |
! T9 P; M7 T, {; B6 E$ O( SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ I2 |' O7 _1 O& q
#include <unistd.h>1 C/ Y7 w) x, M" O: S
#include <sys/mman.h>
! Z7 @! t5 x- T' B- t0 M" ^% k#include <sys/types.h>
! ^7 V0 i1 M$ w" { b#include <fcntl.h>9 O+ n# h& u) M2 s F0 X4 ~1 V
1 v; S" Z2 k# E: {" {" _
#define SHAER_RAM_BASE_ADDR (0x80000000) $ d0 R0 {/ s; F4 G8 D
& L( U+ \% T, e( _# }typedef struct
( I I* o/ l7 Q' ^0 D( \{ Q6 u' F# s' R7 k# n
unsigned int a;
6 K" ]! r f2 i+ @ B unsigned int b;
$ ?" a' Q, Z. c unsigned int packet_cout;( j* j5 C1 j# L* H6 _0 P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 E, O4 a/ }8 ^& B* A4 L* r5 v
. o. @8 `, U+ G& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 R, B1 T. }( I- q) Runsigned int count_copy = 0;
" ?, Y9 ?5 D# g6 l
, x' U. h+ s9 F% S! j% U
4 t9 i& z* y( U! n2 n; Tint main()$ Q$ |: z/ X0 A3 Q
{ X7 ?3 b$ U& @" i, Z" \# b* C
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 `- u6 C% c K; A# }" ? pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ [. Z' v+ y1 v: E( c9 z1 q( k1 u9 Q0 g5 |
while(1)7 n. A/ o& a+ z+ T& M8 ]$ y
{" T/ d* G( a+ g p/ S* N
read_MSG_buffer(pshreRAM);
' w" A$ r! @% v, g }
: [$ B& u% ~5 E5 i}& \3 Y' b5 q1 Y+ }6 F4 U8 z
7 G& l4 \: Z! ?+ y2 l# C0 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)8 W" A: Q( ?. }
{
2 i( f8 T" o7 J3 W% N RX_MSG_PROTOCOL buf;- }* M! k* d0 A
; E5 i. K5 E# ~
buf.a = pshreRAM->a;8 K4 w S+ G" f
buf.b = pshreRAM->b;
4 z4 j4 A. z' N- I G7 Y buf.packet_cout = pshreRAM->packet_cout;
6 u0 a; Z- P y; w% ^: F' C ) D$ h" L- o" k! `* `
if(buf.packet_cout != count_copy), `! Q2 M$ w# {# {. C% K
{
$ t$ A A6 _" k6 x% l* l7 N printf("a is %d\n", buf.a);
) p0 Q* m }& p, x printf("b is %d\n", buf.b);
: l( h& z `3 U printf("count is %d\n", buf.packet_cout);4 D* L( I% Z* r8 t0 V
count_copy = buf.packet_cout;
- a, L6 g8 R3 ]4 } }
$ ~$ ^- O: m8 C# r. Q else
0 E F! `, l1 p- _( o* k9 i {
. K4 w* z* X* t& W1 m printf("No effective message!");8 \5 J: n! ~, {) q$ m' ~: @1 s0 G
}; } O/ V7 z+ k. k. v& a
}! e4 |5 R, r- M$ r) j) k- W# a3 C& m$ C
: e- \. h/ O' z! S3 X1 R% q: T
, k# @2 J! \" h' U. @4 U$ d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- n, V3 q' E3 k) w
使用下面代码,对内存使用了mmap函数后:# J! p: i1 \' ]( R( a
#include <stdio.h>
( }6 V8 S! @$ c# K- F' c#include <unistd.h>
$ T, N: b, l9 F5 u. ^" O#include <sys/mman.h>& [4 U; B0 Q O7 F" @& V, V7 X* r
#include <sys/types.h>
8 C: y; w, k# O7 @$ E( w#include <fcntl.h>
8 t3 o( C# v6 ?( @+ k ?; ]6 [ y- g- w% U0 K" M3 D. y
#define SHAER_RAM_BASE_ADDR (0x80000000)& } p# \5 l5 C: U* z
#define SHAER_RAM_SIZE (0x20000)
* [# K: B. n" Z/ H; B
* r+ c# y r8 X% \7 _- i& Xtypedef struct
9 P) q+ h2 w M9 ~+ r{
( B, F4 A' z/ |" H$ N2 p unsigned int a;# O4 r& f' J, h6 o
unsigned int b;
, W& z9 L l8 v; d5 h/ N) { unsigned int packet_cout;
: `& k7 d' X, L7 @- Q/ T% A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# ^; }7 K) J* O. M
1 A) i# v/ p3 E7 P, ^* s! Evoid read_MSG_buffer(int *baseaddr);4 B+ I, ? P$ D' `) W8 K; A
unsigned int count_copy = 0;6 y8 L# m7 v( p. [
. a4 \5 O/ l1 s: ], K
int main()) r8 \0 Y; e* w$ `! N' _
{
7 d( V0 O0 C/ m! V int fd;4 ^; E) F# h8 ]5 c/ T$ X
int *mem = NULL;1 s6 i' l, i. {( i" O' `
F, S5 p, r& L* U
if((fd = open("/dev/mem", O_RDWR)) <0)
2 \3 |8 z' W) V) A: b4 V' d {/ d1 A' M# n C: E
perror("open error");0 q! o _% |+ v0 s$ q
return -1;# R+ D J+ t E) U, a* n- ^
}
( n N& n7 d ]2 K" t & A0 [8 ~$ N' R! V( q! K0 U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 h4 b& P y# S5 O+ `. T- K1 M
: i9 Y5 M' @+ |0 c0 ~0 l7 [, k/ Y
while(1)
/ x+ ]9 w- d: N% I% d {
6 Z" z3 |1 i | read_MSG_buffer(mem);
; [# f& m% F8 s! b } ! D: ?6 r7 B. C
}
5 W( k% e8 U, @8 @. T
8 v( ]) g2 H/ s7 [+ Tvoid read_MSG_buffer(int *baseaddr); A0 N1 g' w, s5 X. H
{
2 n5 t; ^ f& |) S/ g pRX_MSG_PROTOCOL pshreRAM = NULL;6 J0 K8 |& w# y
; N( m: a( i0 i* S' k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ~ C$ S; f# V6 w+ r, Y
% z7 y" j2 {" o0 b
if(pshreRAM->packet_cout != count_copy)
- J, l: Z2 S: y) R! \' o, R {
7 ]! Y5 O% Z$ b) I) _3 ] printf("a is %d\n", pshreRAM->a);( l3 b0 m! r% C8 e, @
printf("b is %d\n", pshreRAM->b);
( j8 p: l4 x& d0 E* g printf("count is %d\n", pshreRAM->packet_cout);8 a1 x+ I8 o/ F1 M x9 ^: \
count_copy = pshreRAM->packet_cout;
5 R3 l4 X* U' u$ z6 f# ^ }3 s* w8 ]2 a) m4 X
else
1 m' t2 P* }7 j {
0 Z. Q4 n' h0 Z8 ^; ?6 y7 N printf("No effective message!\n");
8 W4 h( }2 n4 H J) m1 U* O }
4 `! k6 x; }: a0 d w6 O}0 Q' Q4 ~* k5 F W3 |' Q% m
4 V! Z; n* I, T4 N A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* U5 J8 z0 }5 F% }0 ]' v4 T% t/ d
5 o0 K! q: u; M: p1 t- V
+ z# @; d% i3 O' T6 U+ X) |( b: Q6 @6 J0 o; _. U: e
% ~6 S- o$ ?1 y8 A W7 |$ Z* e; \+ |1 M |
|