|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- y w7 ~/ W7 |* \& p
- L: q3 W" | t C# S' oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& P: v7 d" W' u( D! a#include <unistd.h>, q5 z2 G1 e& n5 V1 T7 B: m
#include <sys/mman.h>
8 d6 C% f7 q" w4 R- Q#include <sys/types.h>
# ~2 g2 Y; G }( E% u8 a8 P# r#include <fcntl.h>
, [2 h& \$ e1 ]
- u0 g7 v5 l9 ~4 k$ M( p4 j! @#define SHAER_RAM_BASE_ADDR (0x80000000) % z: p# n4 R7 _6 B
! |2 i& a% K# A0 o; Q1 E* P# i2 ]5 C* M
typedef struct
9 {: @- T f% G8 a% n" X{
4 O' d( L2 ]3 y, H unsigned int a;8 e& b2 d& Q5 ^& d2 d* U
unsigned int b;- ]; h8 d+ l7 x4 u( a5 e# E" p
unsigned int packet_cout;
8 F6 a) g1 |8 w( s4 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, f: x! a7 ^$ v* y3 H; b
+ B7 P$ q# e y- {5 z; V1 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);# W% ?3 J% i) b
unsigned int count_copy = 0;
6 G" s3 V$ Y( d- s7 B0 y7 q
/ Q' r/ |- C8 K' }: J5 y% Z4 T% ]
- G9 s' X- J" |int main()
0 J$ O" U5 B+ F0 a- v% o{
) p2 N% Z3 x$ l& m8 `: Q7 G" v pRX_MSG_PROTOCOL pshreRAM = NULL;$ f3 C! L, c0 q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 R+ w) ?& a$ V1 M$ Y& y) E6 L
3 t: s, r+ q# Y* ?! d4 C) T while(1)
! S1 }: K. k9 s# L$ l& ` {; | \2 ]* g1 o1 H; n' `
read_MSG_buffer(pshreRAM);
" Y; h( V! f5 [1 m }
/ V- E7 B4 ?) I6 E. [}' i0 ?7 d4 ^0 P
) s- J9 @& F/ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# V0 r" Z! c7 \$ e{
6 z. K ~4 x% r* g RX_MSG_PROTOCOL buf;/ x# X0 {, |' N5 [& R) ^; `
/ M6 i* F4 R/ W: f3 e- D0 e buf.a = pshreRAM->a;
5 n, a* v1 T; C7 B2 e' t7 w buf.b = pshreRAM->b;
: F5 v+ e' d( i6 b7 n: i buf.packet_cout = pshreRAM->packet_cout;5 T# J! a" S; r9 b* m2 H- z
8 Q/ n+ g3 A7 t: m0 u& V
if(buf.packet_cout != count_copy)
% W) P2 a! k% d7 L! `5 g# d {/ U/ v" }7 `6 l/ X# j4 m+ x: K
printf("a is %d\n", buf.a);
: i Z9 E. C! Z, x. F printf("b is %d\n", buf.b);
6 ]$ U: u. @ d( a printf("count is %d\n", buf.packet_cout);
: B* H7 u; B- I! p, P count_copy = buf.packet_cout;
5 }1 k* g5 b- y4 Q& H% @6 y) Q }
+ i, k6 u! V- p! _8 ? else1 V; ~6 p) _% D7 L6 w5 z
{* A" V$ F v E8 |
printf("No effective message!");
* M( W7 k% g W1 n/ Y) ~- w }
) o9 F2 U- n0 ~# J8 U* k}
: r: ~2 L1 r# N* K5 e" f1 W. l, \& F; @; @! g h" @% w
! N) c0 t6 H. a) h: ? ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 _3 {3 j- M; l' y0 K( K使用下面代码,对内存使用了mmap函数后:; _- N0 ~; {6 j$ C* x2 ^
#include <stdio.h>
! U7 w S2 p) h% {% r#include <unistd.h>
4 x+ s+ m9 d& f8 ~5 w- R#include <sys/mman.h>
3 H+ `: i* F. f1 L# Q7 v#include <sys/types.h>
3 T5 a; V' @' Y# ^6 N9 f5 q#include <fcntl.h>
8 L+ a7 u9 I# L) c, n1 ~' _2 Q d+ }. |+ n
#define SHAER_RAM_BASE_ADDR (0x80000000), D) g, y1 Y! l; {
#define SHAER_RAM_SIZE (0x20000)
8 g n6 n# N2 L7 f G' b% [$ O5 C* @; ?& c; N+ ^
typedef struct+ w. {0 g8 d, y' i! ~3 n- E
{
' j$ C- ]4 h9 y& }3 K unsigned int a;
/ n0 w4 M/ F0 c" T0 B/ c$ Y7 w( L unsigned int b;
4 I5 A0 [+ t: ^! ^3 Y; A' k3 h& U unsigned int packet_cout;
4 ?3 I( G) J1 _& c: |& c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) q. u% Q% ?0 l& C o3 {# c& g! n& b% n+ c3 K. e2 `
void read_MSG_buffer(int *baseaddr);
/ h( P$ T( {9 s3 u: o0 tunsigned int count_copy = 0;
! X( G0 x+ h1 _' d4 q2 a5 P3 X0 s' R2 W+ x
int main()( f, g* b' c1 d8 W
{
5 F( i1 L F* E8 k2 ]6 H; E int fd;
, b. O# u- {- ~* }( p% g int *mem = NULL;2 h1 v) X! u; T" k/ T
. X8 G& B+ `; C8 Z; G) u if((fd = open("/dev/mem", O_RDWR)) <0)6 U$ S4 u3 Y7 e
{. d5 T4 f% m' @! T5 W9 s
perror("open error");
2 v1 s% u1 M X; @/ F, G return -1;4 o. Z6 ?7 p3 Z5 y$ ]+ _$ u
}7 G& U# G6 S3 o' A* p5 k% Y
* `* b+ r4 s1 x- K) K- `" x/ x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 {5 j* s7 `) U& `6 f- w; s
* F, T- i+ a. ]/ h, s% f) N) P while(1)
. \& W" T/ z2 N8 M {/ R9 B' }3 _; p5 i
read_MSG_buffer(mem);
7 @6 d4 Y5 Z9 \/ M7 e } 8 p3 w5 s: l; N- S
}
# c& o% y; J3 ^* X4 Q% a
) Y, J6 r6 M/ vvoid read_MSG_buffer(int *baseaddr)
# k Q1 L, G. ?! l' X' h$ U{
" U/ d5 T4 V. t3 O+ r1 w* H pRX_MSG_PROTOCOL pshreRAM = NULL;. r1 A% W8 ?; ~: s- x
" D: ?+ Q5 o" [6 H pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 u, C& i3 W" k( K5 B
6 _: K4 N/ `" k; s
if(pshreRAM->packet_cout != count_copy)
# a \2 K7 K6 D, m( @7 { {
: W; e. o" _. A printf("a is %d\n", pshreRAM->a);
* E& m( w; q# R0 W+ n: t printf("b is %d\n", pshreRAM->b);/ n4 K2 Y4 t$ Z- G4 t2 g* T
printf("count is %d\n", pshreRAM->packet_cout);( c' J, ^2 K) k% k4 e3 t8 l4 [
count_copy = pshreRAM->packet_cout;" d5 m) M" q7 [2 X/ ^* o
}
( u/ E, T" V, {: h6 S: @ else; R& P- }; r) O& g- J! S
{& c v+ y+ ^6 {% W
printf("No effective message!\n");) W( ?6 I* `0 o
}
3 V4 X' }$ M* w) F}3 w" P1 i# T/ w
. U. f: p3 o) k @4 `3 V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 o+ M2 f, q7 c$ X
7 W* R& b# c' h' R4 g% F
3 ~& T* \# w" |6 ]
% ]0 f. O7 Y8 u2 V+ i, d G. e# W
|
|