|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 s. {; h* C9 h4 G
" }' Q0 z6 u# |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 S* I' q, U1 e% `4 S: V+ ^* N
#include <unistd.h>4 C- _9 Q6 @" A
#include <sys/mman.h># V4 R" Q# K; M9 M4 {- f$ a
#include <sys/types.h>
$ z7 O8 L( c6 \, a#include <fcntl.h>: n$ g* ]! ?1 K1 w4 T$ Q6 u
# t8 y2 e' U9 R: _; o
#define SHAER_RAM_BASE_ADDR (0x80000000) 7 m' J$ K( F2 N$ m
$ n" n) R( |. Atypedef struct2 {& ?) [7 Z( J1 N/ X3 y6 L# s
{2 i% y, e7 J8 x7 R. q
unsigned int a;
" o: u2 ^2 X( X0 o3 Y unsigned int b;
5 Q, a+ G2 q. ? k% e U unsigned int packet_cout;# X, m, l l* M/ }4 X, I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* b& |7 _9 {# Y
c2 |% d4 o3 s4 {- U( G- d4 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# {( t f: t% ^% d; m; e8 O
unsigned int count_copy = 0;
. L, Y* T0 H, }& F: B* g
! i3 Q1 L- b: x
8 M5 g' l+ b! v$ Z8 U; y) U, aint main(). y; B# o' G& o6 d7 S* r
{
1 h$ W+ W, p# [! t8 O: V- @) i, a! R pRX_MSG_PROTOCOL pshreRAM = NULL;/ i t4 C8 u) e) K9 A* o
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ W( ]/ X# m; t5 T- @
1 ]2 } V, k8 C8 I
while(1)
4 l' {# I8 Y6 l" u' e {
0 J2 j+ \( g& G0 ` read_MSG_buffer(pshreRAM);
: u4 x" T/ n, Z, f( e F }
9 i6 K, P7 W2 @$ P( f}$ n, f0 ]/ y3 \) p7 u
" W1 @; z) c7 K6 ? r8 X' G$ {( ?# N! Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), ^/ z* W; W$ z
{
0 C" B9 @9 d+ u! C G RX_MSG_PROTOCOL buf;
/ z7 W6 u% M' W' |' P% ?
7 v8 q* G4 _- i; M- T' p1 z9 e buf.a = pshreRAM->a;3 I1 R* |/ U/ Y! Y) B
buf.b = pshreRAM->b;" ?9 f' ^. X, P, y' O, J7 v9 X
buf.packet_cout = pshreRAM->packet_cout;8 u0 D0 I+ W" j" m2 D
/ o2 x6 B5 t4 k
if(buf.packet_cout != count_copy)+ Q; O! @8 S% y& ]8 S$ `8 b
{
! L0 {0 t1 j( B$ m/ i E* e printf("a is %d\n", buf.a);
" y' K0 R: S+ M( a! o* A8 F9 _ printf("b is %d\n", buf.b);: e8 Y5 L+ N, K: }7 X% a) y
printf("count is %d\n", buf.packet_cout);
# E3 z" d( n/ R count_copy = buf.packet_cout;6 g) Q1 T" v9 \ Z* ~2 @2 j& o
}
5 Q" u6 U; _- Y; t* c. D! b! c else( q2 W* ?0 s9 J
{
4 W+ C2 N1 w+ i* Y' z$ h: ] printf("No effective message!");5 g6 t7 ]9 E& O. z
}
* `* R1 S4 G' p6 Z}6 g$ c3 v N; L1 Y+ V( |# `
$ r, b% A6 _ `3 F# O* c# C+ V
2 `; i; O9 F* h6 A- y3 f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ~* _* h8 L5 m( h: I9 c+ ?' n0 T, z使用下面代码,对内存使用了mmap函数后:
! A# p# b. X/ Y. r3 C#include <stdio.h>
0 S( d, B& I& b, C |0 q. e5 ~& C#include <unistd.h>
) |2 h/ Z1 G5 a' Z0 ? O d#include <sys/mman.h>' H) b% H0 k: J8 `0 o
#include <sys/types.h>
' S2 d) p/ |# s7 n' C#include <fcntl.h>
; K$ h- n' G/ e5 X
6 y7 w4 I7 G& r#define SHAER_RAM_BASE_ADDR (0x80000000)
( Z( k1 |. y* D; t#define SHAER_RAM_SIZE (0x20000) 2 k( T2 e0 ?& H: ~7 r
, g1 ~ Z4 Y; }, F% mtypedef struct
A+ |2 o: o) e: A; T$ j1 _{1 [% }( b6 ^; z, f6 ~: t4 j
unsigned int a;: A/ X& p* \& @0 b L
unsigned int b;! `4 i2 G1 _+ g) m/ A, C/ s
unsigned int packet_cout;
' M/ \+ c* P+ u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% ^2 I9 v. A' O# v( ~3 u# M) ^" n4 }% n5 L) w
void read_MSG_buffer(int *baseaddr);1 I; C; r% M. g6 ~, Y W7 e) U
unsigned int count_copy = 0;9 z. U, K% A, t
# @9 B r y$ H$ Q4 H# m
int main()% x5 E. c0 |) V8 Q4 s" {* W( ?0 B
{+ O: q+ J) h7 w/ L3 N
int fd; R) I: u) v0 k0 j$ Y/ y
int *mem = NULL;
3 {* t1 V$ z8 B- g* Y0 d& t
3 N# L- f- [/ u' a* `: e if((fd = open("/dev/mem", O_RDWR)) <0)
7 D! [6 P/ z+ L | |/ a c; s {
+ d! j8 T# \- v& [, Q. R perror("open error");; H" [' r1 f# q( d
return -1;
0 g$ m& x8 Q' b! V: L }
; I2 t7 v& o: ` I" \6 q% O # m# h5 \" ^0 l0 ` t7 \
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- m) o6 s3 A6 `
% f3 j# X; L' L
while(1) ^4 x: X/ I# g% ~ K
{) d- j. u1 t: G: v4 Z
read_MSG_buffer(mem);/ J5 O' l# \+ G: H- w, T m5 f
}
" T% U7 m( \9 d}6 R% ` x; ]/ T& f) p: s: C, `
: d% I d- C: S+ [8 d6 [void read_MSG_buffer(int *baseaddr)6 t, f" e' G4 Q) G1 A* U, e
{% {; r, y8 E* i x2 t2 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;% O1 ?$ \) J7 Z6 G- a
H. u1 @- m z' j! o+ w pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 g& J# Q7 y8 F# }* J8 m. T
& Q* D4 s5 u5 D" F( }4 v+ M if(pshreRAM->packet_cout != count_copy)0 l6 D' A- F& Z/ e% `
{$ d5 v, V0 C9 @8 |
printf("a is %d\n", pshreRAM->a);
% B' F- V1 U* I printf("b is %d\n", pshreRAM->b);
) b, c% T" p* { printf("count is %d\n", pshreRAM->packet_cout);# R# |7 \. s4 `% ^0 \8 J5 h) J
count_copy = pshreRAM->packet_cout;
' _! L# M/ u! j8 k4 Y5 u! b }
' [5 p7 W6 @: C$ } Y# s else
0 q9 W9 z, z) V( B3 b {
$ o+ Q# p& a9 H, U& L' X% y printf("No effective message!\n");
2 m: ?: b# ^; h" A" \2 ^ }* Y; @' G/ ~; L, t4 E
}
{) e, {* E, i0 Q
; P6 ?. M3 [$ E2 F. V+ V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( C3 b L, J. I+ ^' T8 f
. y" m! j# f. b/ U+ O7 W, {! S+ V' P0 ?4 \$ C
9 X- r* O: d9 f+ e. x
& ^) m- y* F' A; s |
|