|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 V' k; |* R' d0 X2 a4 x# w
2 C4 i! u9 g Y3 K( y$ `# p! D EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* c% C/ W8 u* Z0 X#include <unistd.h>3 E; n# a: D2 y, N
#include <sys/mman.h>0 ]2 Z5 N( O$ X7 e( h9 P
#include <sys/types.h>
+ r- Z; }3 D6 z#include <fcntl.h>4 G2 b0 C. d6 ]* p! _ W4 y8 w$ u
+ p. K: r) O/ [+ V9 z4 c+ u, J
#define SHAER_RAM_BASE_ADDR (0x80000000) 8 b) l1 F) b, @3 A' u
# e4 f4 T0 P3 a% Ttypedef struct
% p/ G0 w" L( q1 h+ }{
8 _ u$ Y% p" d: D unsigned int a;& |6 f, ~ ]2 w) { n K: T
unsigned int b;
9 Y2 U( \6 I4 y; q h unsigned int packet_cout;
% P! @) | E# Y f& U/ g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! E& I2 h. p Z5 L
" @; Y- N: Z* b+ i E m/ vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 b8 I/ Q; L3 C: Z2 Bunsigned int count_copy = 0;+ a! Z4 H: G; P% E& L2 r0 X5 R* Y- Z; [
7 K. G3 x4 R" m. {9 J
6 _' B5 E. L9 A$ x+ g. Hint main()
1 k$ l( }8 Q! u" t( Y& v) [{
( c* Y, s: Q9 M; n1 q3 n. a pRX_MSG_PROTOCOL pshreRAM = NULL;
5 a, @& v7 W) A pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 m# c( Y& S' u3 M" |4 L2 P
# x, j! H- x$ ^ while(1)& q4 P/ Z% u1 m# k$ N9 x
{3 C, c' r& }3 R3 I7 ^
read_MSG_buffer(pshreRAM);0 E) J# `9 f3 X+ d
}
2 b$ a! v$ I* }2 F, L3 \6 Q}
) a' V" R& L7 u$ X) Y% g0 B' i ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM) H5 ^: N& r% T/ L# F8 P
{/ X# R+ ?* I1 g9 d, u1 c
RX_MSG_PROTOCOL buf;
1 h5 d6 j* [0 S3 x2 r$ c: S / v# O6 @) i/ f4 x! ?
buf.a = pshreRAM->a;& `0 x' o4 _& M: L
buf.b = pshreRAM->b;& m4 m- u/ C$ y# ]1 X7 \8 w
buf.packet_cout = pshreRAM->packet_cout;6 W6 i# d$ g0 Y" B
% O, j$ O4 s' J2 X
if(buf.packet_cout != count_copy)
: A6 T3 }7 @ r4 D {
, j% a1 S& Z3 ?5 C/ F printf("a is %d\n", buf.a);
9 T9 A0 B8 v2 A3 H9 g* ]- ` printf("b is %d\n", buf.b);
/ D- H% V% _+ N- i3 R printf("count is %d\n", buf.packet_cout);
: |0 f7 ^0 N; W* F& t5 ~ count_copy = buf.packet_cout;
1 w, Q9 n& p! v. R M }
/ l! y1 X% Y* {9 E: _ else
: a1 Y* z+ I5 s {
) T0 y* Q3 n* M! m8 F5 z printf("No effective message!");
; f+ j% @ a9 p0 ~& i }' I! e- }" e9 ?5 x
}7 h6 o J; q) D1 X
# |- a9 Q, c$ Q ]4 e
( _: p. c1 K8 N! C+ D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ S% v9 j% Q+ w7 U6 A, s% J
使用下面代码,对内存使用了mmap函数后:# T8 w. Y$ J/ c5 g1 G2 Q
#include <stdio.h>
; m. \/ Q3 S. U" J+ S9 M- ~! s9 @+ T#include <unistd.h>
' W) G- B& Z5 x t t# g#include <sys/mman.h>
0 k D# o3 I9 J( ?#include <sys/types.h>0 F$ V+ T' `, p# A9 n
#include <fcntl.h>
2 o6 M8 C& H( P) A* J% a, p; i; _" M/ K& J1 i# _
#define SHAER_RAM_BASE_ADDR (0x80000000)
) ~- X9 P* f. S' R+ V6 Z#define SHAER_RAM_SIZE (0x20000)
* N: |" C; K4 ?7 Y6 t' A3 ?( W2 c/ O, a) G5 F/ k# s4 ^. l
typedef struct8 N& ~9 m2 W! j0 b c+ I3 b0 b2 c
{9 M: q) i v! [0 K1 K
unsigned int a;$ \4 N) S; m- X- D6 a' z) P
unsigned int b;/ A3 ~ V% u0 U( J* |" d
unsigned int packet_cout;
/ W9 S+ ?/ z! n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! b0 w% c* s% t8 j) e
# J3 u' }% |8 Q) |
void read_MSG_buffer(int *baseaddr);
1 V J# S- n5 q2 N }& g* @7 ^1 uunsigned int count_copy = 0;
# y+ r; X' r; v% Z, j9 G- s: i. L6 ]3 t! O3 g+ M6 ]+ E9 u
int main()" e& R3 ^: m6 {% ^' G
{5 o5 `* `1 N. ^+ n7 s5 Y
int fd;1 w8 P; p) p+ ]' A
int *mem = NULL;! R8 H( _) P5 Z/ R" X' l
. l7 Z. ~# |4 N+ J1 I. B if((fd = open("/dev/mem", O_RDWR)) <0)
3 m5 N7 {& ? [. n1 w& @0 C' X {
& j' {1 `/ L i/ }: H3 ~ perror("open error");! s7 S0 m- k+ X x* {
return -1;
/ P' q3 |5 B# o' N$ R% E7 Z1 I: I }
7 X* Y. ^6 Y3 F' P' w7 p
% n- R6 @1 R' I' A- s/ y w mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- P4 A& M( e& o' ^8 M, p
) a* d/ O& C* n8 y while(1)& c/ c; r7 X3 h, L5 h
{$ Z7 b7 ]9 ~; w6 i+ g
read_MSG_buffer(mem);. [2 d: w4 E% y' o) Q( P
}
( F* P/ e! _2 ]4 W4 H; @}
# F; U" A( X7 B4 S6 F5 e, M6 L& m; G/ ~! T' Z) |+ Z
void read_MSG_buffer(int *baseaddr)" r1 ^. e* p& f
{
+ D4 X/ K n# U& p! M; y pRX_MSG_PROTOCOL pshreRAM = NULL;5 X. Z) y8 j% n+ N! r
( U. j% U3 q( k: ^/ s* s pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 U! v$ H$ `; E4 I! x: ^' U. K" e
0 V" l' X. M: D6 u6 [ if(pshreRAM->packet_cout != count_copy)
; Y. v( ~( [; }1 M3 I2 @* W9 [ {
6 w' j) r N$ \! L& s5 }0 Z* G- y printf("a is %d\n", pshreRAM->a);
) e/ I- r- q3 @8 \9 P printf("b is %d\n", pshreRAM->b);
! z( H4 p% p- R& U4 a1 Z printf("count is %d\n", pshreRAM->packet_cout);
, i( m% M1 B6 s count_copy = pshreRAM->packet_cout;8 R' F$ L! G! M; w z
}
$ T3 v* y9 A9 i9 ~ else- `) _7 f1 e x) E
{
1 L9 F) o8 ]( G4 G8 w printf("No effective message!\n");) w6 {1 E, k" e8 u( V1 r% E
} p8 o* i- X7 A) s3 z {* a
}
% {& m6 L' G3 M8 }1 B# Z) w# d; y
/ B( M( I# P! m6 X, m1 k- A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 A* G3 J% E N3 C5 @5 Y$ T
8 ^& @1 G7 q; V
- N' p4 r5 s6 g, [
7 f; |6 |; p0 P9 ^& P
6 h& q: J) E3 b, _* W3 y |
|