|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 ^1 I' @) e8 p. z# b. ?, E/ G: N0 a Z+ B5 R5 @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ W7 x' F1 H' O. k8 ~$ w
#include <unistd.h>: a: c0 a8 [5 }6 C/ U! {) K3 P
#include <sys/mman.h>
: w& l7 l( |4 S u#include <sys/types.h>
9 w6 J) ~+ Q% }& ]#include <fcntl.h>. g9 [# D- v% g3 \* \& ?$ W
9 O# W+ v3 Z& ~9 L#define SHAER_RAM_BASE_ADDR (0x80000000) - |9 ~! L$ n* q- [
" y; J$ c, u% H8 Ztypedef struct" S. W/ y8 A/ x. s# C% I
{
% B4 Y- J, B3 `4 W unsigned int a;
( r: S. q& Q$ d/ i! E' C unsigned int b;. `3 u7 e& i/ j4 M- R) n/ u! m3 o7 m
unsigned int packet_cout;* s! Q( v% C, S5 q" d Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 B+ g/ Q, V; h+ v: m+ H. ^/ A* F/ O I) e2 R- J
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 l6 L2 Z/ l2 ~$ X; g6 u
unsigned int count_copy = 0;# M2 c: u0 r5 M) ~
Z& L' P4 r l8 U: w$ ~( \2 c6 l$ Y" V
! e0 ^9 \1 M) k) Q# J( T
int main()
0 t4 T0 @& g ~ X7 o% N. X8 Z{
( C% ^$ B( N/ z- v0 S5 c' v9 I/ l pRX_MSG_PROTOCOL pshreRAM = NULL;! [/ e, J8 W9 w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ f, H, I" I& i
/ l6 W, P$ z2 Y! W7 u# v+ [ while(1)) q8 s+ t+ ~( e8 x5 b3 r
{
3 F& o( x Z% F9 o. m E9 e/ s1 U5 D read_MSG_buffer(pshreRAM);
. ]3 s% V) r$ F! a# ? } ; Q3 d7 L9 A% J$ _3 i
}& j6 e) Z; ~9 y0 C, j5 b
; ]- L# T" V- ^6 C- @$ @6 n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 q* d& K) P2 J; K( c G- t, Z2 _{; ]3 E; @3 p J$ y/ n; b1 c
RX_MSG_PROTOCOL buf;
1 u j ]6 y) ^, I7 { & Z4 z. {/ L7 {0 |
buf.a = pshreRAM->a;
& H4 I% ~7 s7 a F; _4 P, r buf.b = pshreRAM->b;
9 i9 h9 Q% t' Y$ d( W buf.packet_cout = pshreRAM->packet_cout;& T5 g5 f# ^# ]# E# p; Q* r
, V: u) ?5 P: q( R0 n8 Z: }6 e' d: i if(buf.packet_cout != count_copy)3 D1 @9 o% `2 i* E* x9 ?
{% l: c& X! F; [( j! b
printf("a is %d\n", buf.a);1 B6 W6 E8 l+ i( ]6 ?
printf("b is %d\n", buf.b);2 ~- r8 @* _ n. Q
printf("count is %d\n", buf.packet_cout);9 U M- O; Z) f
count_copy = buf.packet_cout;# M7 N% n+ u& I/ q- t" b$ o- V
}" i& L0 z" U% r+ T; k
else: y% a$ y) [. c6 a; b
{4 H' A; m- i1 P, r
printf("No effective message!");# v% N6 y% ]" r
}, I, a0 ]& c2 L, J
}, a% g3 F1 j% r: ]; c
A. C, i0 Y+ J5 w( ?
9 g: H& z+ j; M+ R3 f, t% n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
, A. E: R, w c- r( K$ |9 K使用下面代码,对内存使用了mmap函数后:- @) Q3 Y. f9 b
#include <stdio.h>
% d4 y' [& y: u; z3 L' N$ ?#include <unistd.h>
1 ^6 `8 ~9 N9 T3 ~5 n9 p) N( Y#include <sys/mman.h>
E3 A1 l% L6 P1 a$ u I( E$ G#include <sys/types.h>1 O( l6 e" K `2 L0 p
#include <fcntl.h>7 u' ^1 Y% j8 z$ P( h' Z/ S
6 B3 J4 }" T" V' g6 n1 @
#define SHAER_RAM_BASE_ADDR (0x80000000)6 d9 \! x ~! v8 u; o$ U( H, `3 c* f
#define SHAER_RAM_SIZE (0x20000) ( [+ b3 D1 m6 L5 T3 o
; e3 W9 A1 v# O" j% k: Atypedef struct6 G; i( g2 y/ h8 K2 q" `
{+ S f, f4 J' \( M1 | {, j6 B( F
unsigned int a;
8 ^# W# f J5 `$ n9 | unsigned int b;( m- a$ a+ E9 [' M
unsigned int packet_cout;
4 a) Q, H- m" L( l# d, n! o+ n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! o/ c, q- O$ v" T& x" c% ~
/ x: z# b6 m) k4 d5 Ovoid read_MSG_buffer(int *baseaddr);
4 h6 e" g$ {* ?# z& dunsigned int count_copy = 0;$ U4 }( K+ [1 e' \4 }* T0 S
7 H+ f% @6 k' e9 F I
int main()
2 `8 S; q, I' t r1 ~{
; I; T7 r- R4 C5 q" m int fd;7 \: @0 y6 n$ E, p% Y; s1 A
int *mem = NULL;
$ i4 d& v" G: |/ W/ V# ^7 M. U7 ?" z: w' u- j7 Q
if((fd = open("/dev/mem", O_RDWR)) <0)! T# y* n5 Z! Q9 w, N$ q
{
% J" p% q( ?+ G9 S: G# \ perror("open error");1 T, a+ B( L' p( D) h8 n
return -1;
: M9 r6 E4 n0 n }; \1 r) C/ ?6 L
( R3 ~- Q. `$ O2 | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 E$ G% }" L Z E |( O; p
# q. n, C: ]1 |5 s0 M while(1)8 C/ s2 c/ ]$ s" d
{
8 x+ G1 z0 }' n+ q- K read_MSG_buffer(mem);" b) c. _; e- @; j% m6 y: h8 L5 v
}
5 y1 y; }8 A# o: R}( {5 f1 O+ S7 S
3 T5 `1 p; i9 t5 F
void read_MSG_buffer(int *baseaddr)
# B! r6 K9 ~1 O; C5 @{; l( s }8 j" n6 u7 E- z
pRX_MSG_PROTOCOL pshreRAM = NULL;9 W" p% O" [& j( h' e0 `/ z- @
5 t# S! c& j# M& E/ K pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: t" I. c) z/ i8 H
$ o, y8 y6 s6 U# q" E if(pshreRAM->packet_cout != count_copy)
. p% [/ o, V; P9 {% O {
9 v; l4 v" z9 o' g+ m printf("a is %d\n", pshreRAM->a);) X& v: S/ D4 J' l: N
printf("b is %d\n", pshreRAM->b);
6 K- S7 W/ s+ d! A: l* { printf("count is %d\n", pshreRAM->packet_cout);: s1 P2 T6 u" N
count_copy = pshreRAM->packet_cout;
2 ]+ t4 f; T: t; p1 ~( |8 V }' Y. j2 X7 `; U5 }( k; d
else9 w2 C, c3 H4 q- W
{! |, b5 [# P5 O* [9 ^; }1 v% D7 b
printf("No effective message!\n");
/ V& i( u, R" j }
/ {: ] o- q: ~1 d4 G! G+ w6 E}! g( r# V: W) `' d9 I5 \" A7 Z$ N
5 `" g* \& @# f3 ~8 S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, Q z+ B- S1 ~: R i* |
: ?" a0 ]/ R" {, z& T. u V0 e/ ?
# j& V* X6 ^( b/ l& o2 s% d
3 f6 j- F. t7 o, b/ B" F) i$ X8 ^; ~2 q
|
|