|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - a2 y* `0 s& ~9 x* E u' T$ M
5 a& c% o9 ~1 I( b0 `( }" Z* ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 B2 B: w, L, C* a- t, C) J0 U
#include <unistd.h>, g2 C: v! X; ^% d
#include <sys/mman.h>
" r" X' m4 q+ E3 Z# s) |1 G#include <sys/types.h>$ f. ?9 F- H, E0 E% N+ O7 ?
#include <fcntl.h>
! q, E$ k/ y1 J3 y8 h
- n2 W2 t. V' X" n' u#define SHAER_RAM_BASE_ADDR (0x80000000)
/ b- m& Y. A3 k9 P7 o& @% y3 B2 d& x6 I u. ], q( v
typedef struct
( N3 O. C4 n; P' L/ N& `* j{
& W4 }% a# ~' V! n# I7 [" n9 x unsigned int a;
6 h" x# x! f2 j+ `. \& b( | unsigned int b;9 ]$ P, |3 n" B. K3 W( w
unsigned int packet_cout;
7 t% X. q! r3 ~2 g7 g1 O4 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. r5 H# i$ q" k8 j# I
5 t& g& ]5 L& S7 W q2 A* i W/ Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" i. m6 ~5 e& r# E6 ]- g0 m* Nunsigned int count_copy = 0;0 a; x, O$ q' V2 P F
: _# `! R4 x, b, @; m! Z
) a9 i" E6 n' Wint main(): u; |; R( {( H& A1 p9 X8 A, B
{
- b9 i( q, @8 Y5 h1 s) b pRX_MSG_PROTOCOL pshreRAM = NULL; d, C) W1 u2 t! ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- E1 T: Y- z! N
. E/ N8 o- A _! [$ [6 P
while(1); u3 L% K Z! l2 G* O+ a' A7 Z
{
G5 i% e1 |" k" j3 ^8 O read_MSG_buffer(pshreRAM);
2 B+ X5 X3 Y5 l g2 ` f/ G- c } ' C: W& v/ L, B j9 X7 F
}2 y4 k& ^# m6 l" ?/ e
- R) D* k; r% ~2 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 V9 |$ s5 j5 ^( ~; O5 l% o' u{
" h# E4 m1 S' k( _# P RX_MSG_PROTOCOL buf;) A0 E( L% w2 E
( q& O) W3 j. u% S; B
buf.a = pshreRAM->a;7 G8 V; \+ g% G) w6 n
buf.b = pshreRAM->b;; ^: K, d# w$ B& k
buf.packet_cout = pshreRAM->packet_cout;$ e9 z5 A9 j5 N7 M0 [
( h3 D7 v7 x) }' ^ if(buf.packet_cout != count_copy)( _* N5 H# M! J5 V7 l& U
{2 [( N. f1 e) |+ z7 w6 d
printf("a is %d\n", buf.a);$ W% q7 o5 b- ?' T
printf("b is %d\n", buf.b);
. t5 @8 q/ {- F. z3 x printf("count is %d\n", buf.packet_cout);
6 d9 ~$ v( E2 q9 A- ? count_copy = buf.packet_cout;
6 r7 G" O; j0 j4 K x }9 E) b- t0 a. p L$ a) @
else3 ~* w @+ s1 Q. B4 b
{* Q$ I/ l9 k: u& C! c! V( O3 b9 W4 G
printf("No effective message!");9 L7 l0 V2 N% ?; ^5 m; \6 J5 `
}. F# I' I% f1 c9 K; n
}
6 G, q6 @) @4 \7 D" N3 G6 H3 G6 L# Z$ r
2 w) q9 Z5 S* ?1 B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ q/ e# n9 b- [4 B使用下面代码,对内存使用了mmap函数后:7 v' n! \, F; P; R- H
#include <stdio.h>
) G4 v x( C( [" V5 c#include <unistd.h>, R! x% |5 C! u. z
#include <sys/mman.h>$ N/ u9 f( R$ ], s
#include <sys/types.h>7 F. f$ V7 j2 H1 b5 Z/ H
#include <fcntl.h>& R! V W) k% G1 t% [. N) [; A
/ O3 O7 i/ d9 O6 D: O% \: n4 L" K, \
#define SHAER_RAM_BASE_ADDR (0x80000000)
{2 I; u' ~2 G# s* o' N% W k. _#define SHAER_RAM_SIZE (0x20000)
5 \- w+ ^4 X, K, {8 H& e' m8 j8 w4 o: ?" U5 O, k5 B. T
typedef struct
2 o4 y' E2 o) p) @{5 c/ _- U8 j: z! f0 A& t/ Y
unsigned int a;
* j5 V: W; M$ d9 B unsigned int b;
8 g7 Y# Z" [3 s9 [7 ^% s( B' g) O unsigned int packet_cout;0 s$ G. F* E9 N1 L# C/ O! o4 R9 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 M3 B( k( u( }4 P0 G5 A
: g8 m" J( d( i! r3 X- n- h. h
void read_MSG_buffer(int *baseaddr);
* p& a+ p: k# y/ j0 D0 D' \unsigned int count_copy = 0;
% r! j7 `' o5 H+ F) b! `8 B
4 ]: p, U6 x7 \int main()* i9 ]9 g+ U: x y1 }# Q4 k
{: u1 K% R% g# H6 O
int fd;/ ]* o2 T$ x s/ w! m/ z& d
int *mem = NULL;4 u' I9 R- _7 n8 Z; R u7 V8 t
/ r1 l' |9 S& G; g$ Q if((fd = open("/dev/mem", O_RDWR)) <0)
Q) J2 E5 C$ V% ^2 B {
3 M5 t2 N$ L W0 W; Z4 w/ l perror("open error");
4 M+ P) Y2 B: x% z return -1;1 D- u# t" ~4 { Q3 E9 ~! G- y
}; {: }$ @" X4 h% c- X ^) R, w
4 [1 u( w: h( z% g4 C8 S mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 n- t* E9 w$ a+ X
6 T7 S/ b; B& V1 i+ ]! \% K while(1)
% t, F: q: l& h: G5 q, [2 m {
J- {4 }, W, o J7 ]( c ?3 O read_MSG_buffer(mem);! }& D% ?2 D8 {( Z# Y, R0 H% |
} 7 n% R4 o2 F/ A( x* ^* o% r
}
# [$ L/ r) k) C# ]! Z7 i* \. L, o; l* X& N# h( I
void read_MSG_buffer(int *baseaddr)9 M. |7 P! k! L) ~- \
{
6 I8 Z* h, F3 u( Q% ] pRX_MSG_PROTOCOL pshreRAM = NULL;
+ R7 J' a5 v" a# l/ Q; m, x) P) o: w O
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& t. x. P9 u1 N9 @! I5 T: p0 i. m! F0 I. i' L! V$ {2 H! m1 ~4 i
if(pshreRAM->packet_cout != count_copy); Q& z% f! b, m% ]2 c4 K2 O
{6 D1 k1 Q/ L" c
printf("a is %d\n", pshreRAM->a);
7 n0 I. j% }6 h printf("b is %d\n", pshreRAM->b);
. R# j Z4 U, K& J3 A printf("count is %d\n", pshreRAM->packet_cout);( U$ z9 y5 N6 ] J( M7 i: E
count_copy = pshreRAM->packet_cout;6 ^) [; V, M0 _' R; u: ^+ _$ M
}
# S* X( O1 f( G) } ~ else
) u# G: Y: `! ?8 G4 x- B {
1 P' R! Q$ z g; B. p; o) b printf("No effective message!\n");
% N* @' X7 N) S- B2 l+ v7 I }
- ^1 E, f$ {- ` h" e% N}
! y' R Y8 ]2 t2 s, y$ }
3 X! l1 d. h7 V5 u2 @* B( [5 W没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- P/ J7 F2 t9 H8 O/ D; A; [! K. b
5 |; t) _/ x f& M2 R
% F2 q& i! I! W* J' ^6 o9 q, b9 q. f7 k/ ~
1 @! x: T, V: W: n. k7 [ |
|