|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) T9 x4 G3 s. e" D4 H1 E% G7 m2 ]4 b4 v; R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. ~' c; @$ H# c" p9 _0 ^! ?#include <unistd.h>
3 A6 ~6 m- F6 v, d0 I9 p# b- O#include <sys/mman.h>
6 q; Y, C$ i- S7 ]" @# O1 s" n#include <sys/types.h>8 o" \3 w% H! p5 \/ {: ~ R
#include <fcntl.h>5 J0 p- P: ?' i" H- X: Q, C
* V% O$ z4 N3 Y) k& m; y* [2 y#define SHAER_RAM_BASE_ADDR (0x80000000) / L+ x1 d+ K4 r, n
* d( `1 q# V8 [$ F" l9 g7 j, r0 Z9 _/ Dtypedef struct: b7 Z, Q# v, i! H o: H
{0 H( S! N2 ]; \' z5 Z
unsigned int a;
' N; s1 H# s6 j" R. x unsigned int b;- I8 h1 I- c' h1 I( A+ {
unsigned int packet_cout;; k+ l5 T9 V5 m; d0 A: \2 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
x3 m$ t6 m* R% u5 N3 i
' U, c) g0 b" J- F6 r* |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 U, G( D0 h8 D& a& O1 H- }unsigned int count_copy = 0;
# [9 D! G( l7 ?( M6 P& O
+ k2 r; }! g$ B: x( J e% h/ C1 U! A( r: [* P9 G
int main(), U8 u+ z4 m* ?& [( t( z6 S5 J
{+ N/ B; L: f2 j
pRX_MSG_PROTOCOL pshreRAM = NULL;2 |' G3 n6 y6 m! m5 T* T
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* \: J. x& {8 A; L
2 a8 r# l3 `- O; W) B5 p+ b4 I while(1)
) J( C% f" M" c4 a) C {+ [- T- j, N% ?- C6 H7 U) f1 W! F6 h
read_MSG_buffer(pshreRAM);
, V2 n* `* J1 Q' s& Q+ q }
' |) V7 f) q6 d& y, |9 b$ o}
* m6 K$ o' }* I! i! i/ s. ]) t2 S( i9 O2 R/ ^; O( T" m& h' m9 {) ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! c/ l. _7 f# b
{* A! {1 ]: J) W' A" k0 s% x
RX_MSG_PROTOCOL buf;
/ A0 s T5 i$ T" S+ O 3 W( c9 d+ ^3 b1 V( e' S
buf.a = pshreRAM->a;- E: M8 [+ a1 F" C
buf.b = pshreRAM->b;
# j3 {8 x" c7 o buf.packet_cout = pshreRAM->packet_cout;
! q$ y$ s" u" t, r) l- X$ c ( a7 \/ \' v i9 o: D' u8 \1 M
if(buf.packet_cout != count_copy)& i. E& L1 k% @2 J& f; _. C
{
# F1 G3 ~" G! o" K; a printf("a is %d\n", buf.a);& w4 l, i. _* ?( X& c6 r' g; p* a% n/ E
printf("b is %d\n", buf.b);, P: K9 V- B9 M. e- [
printf("count is %d\n", buf.packet_cout);
0 Z/ ^( [/ N7 K- E" D& t, O count_copy = buf.packet_cout;: N( _* ~# O+ E# Z, u0 O
}
3 o% ~/ m2 i2 F# t9 E9 g* B- d, \! Y else: ]. G2 [" D8 x4 ~# |
{
$ ~) c& [- R9 l3 g2 C1 H9 B5 _0 M printf("No effective message!");
+ L& H* B: L& j }; z) q! O4 X& A/ o6 i5 ?, J7 B
}
# r1 ^' z0 }, g2 Z3 Y5 P& K, l" T8 O" C. s: b7 ]
/ j1 h' G) W0 @6 O }* O, [9 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 d7 c& }* h/ Q* J7 }7 e: |7 W( D使用下面代码,对内存使用了mmap函数后:8 l) Y. x. q3 y- |
#include <stdio.h>
7 B% r5 W0 f+ D# [" j t#include <unistd.h>
5 s i% t) l! d3 ^* K#include <sys/mman.h>
) D' I- n% j9 @7 u0 p0 ~#include <sys/types.h>) \) `0 x$ a7 Z+ W- e. M
#include <fcntl.h>- p# R8 }3 ~* I+ J' B- r0 ^
3 ~+ R3 H' w$ b* t#define SHAER_RAM_BASE_ADDR (0x80000000)3 [, e& N7 U: w6 j6 o
#define SHAER_RAM_SIZE (0x20000)
/ R, {0 M4 @7 p, H& G! d2 I) _1 S) I( _) d+ ~& |5 M. g
typedef struct
; L; Y: u& q4 T7 ]5 {* b! I0 n7 }2 H/ z0 f{
& ?% E W3 |, z, c/ d unsigned int a;
5 B, Z( `2 D7 l" } unsigned int b;/ I9 \4 O3 p5 h3 Y5 `- R
unsigned int packet_cout;! R' R! S* z3 ?% F4 \! ^8 s) T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 r- g3 B7 v& S0 M
7 J2 r3 C: c( v |! }: |8 d9 Mvoid read_MSG_buffer(int *baseaddr);3 Y0 u' k& l: ?0 N3 _# @
unsigned int count_copy = 0;
( @6 E2 u v8 B. K I( E
" g& W8 t' S3 Q: T3 _6 U4 w" Pint main()
3 {- f) b& m0 Y. i3 L{- n& G- k+ c0 ^
int fd;/ c* T' A0 Y6 f# _- r+ p
int *mem = NULL;
9 u* D0 U2 O6 d" t. f0 d# r, C- |6 Y! G6 ? B/ R
if((fd = open("/dev/mem", O_RDWR)) <0)# S; C; i# O/ T
{; u& p/ n: K5 g9 m# P
perror("open error");8 w) l" r: c" V" L. K' t: O6 m
return -1;+ \9 ]) e& F* a) F& y* A! K
}% y ^, l0 j; ?$ B0 V
. n4 |; Q# x- ?) V mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 J3 x$ D9 V$ @
h: \# U( @$ B: ] while(1)+ d o' T4 R ?1 _7 Y) s) \
{6 v/ w4 D5 X! y+ a
read_MSG_buffer(mem);9 H; A# p2 m" c. `6 E3 J0 @
}
, d* b& [& e3 G6 ~+ B z}0 E! f" H) ]! r$ r0 ]" X& ?. o
+ s4 x& ^4 L" }+ }4 A9 w% P3 L$ Y- n0 M
void read_MSG_buffer(int *baseaddr)
( T+ v# @/ g$ Z5 x$ i( ]{1 X9 V Q' _- O6 Y/ F5 | g0 i
pRX_MSG_PROTOCOL pshreRAM = NULL;& S9 @! | d3 ~8 E3 `3 z7 Y
9 Q6 D* [8 N0 [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" }9 k2 ^* d1 g4 `' f
3 g, J& y( X% h: M if(pshreRAM->packet_cout != count_copy)
8 H9 s, C( Y: I; o {4 Y4 ~/ {5 R! O9 ]
printf("a is %d\n", pshreRAM->a);( Q" Z/ G: B2 Z3 b+ A6 w
printf("b is %d\n", pshreRAM->b);6 m9 U1 t% J5 H7 t. `
printf("count is %d\n", pshreRAM->packet_cout);- m% w1 B, P6 f5 G2 R/ A9 T
count_copy = pshreRAM->packet_cout;. J) R s1 i2 T+ {
}
. ~: _" J4 W, {! d+ J. W else; o& e7 R5 c; ^) B5 c5 v- Q0 u* B4 G
{
% r! `! ]( _3 u6 m# |/ s$ T0 B printf("No effective message!\n");
" S3 g* ]/ h7 q+ `& ~ S! q }! F1 W0 J6 u" V, i! `/ ^, q+ s
}8 ]( u# v1 i$ X( ~0 G$ T1 E
; l7 u# U$ q: m% f$ K/ m8 O! e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???: T C g* E4 e# d2 a
/ S. b# J8 t0 I. j: `
' U% ]+ [- o& @. e3 w) \9 G; R6 ~
5 r: j# z* i7 L5 x* M8 p* A
7 y2 g* Q, c3 s# U
|
|