|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( g5 v6 h( Q8 C1 L
3 l+ p9 j: d3 c# S( r( iOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" f/ ~5 u4 I0 }, g% ~#include <unistd.h>
* {9 p' n: a" T9 m* x+ O4 T0 z#include <sys/mman.h>7 ]$ e8 K6 |. H, G' k0 D9 I0 R
#include <sys/types.h>3 n6 ]& m8 G1 N
#include <fcntl.h>
' R( {! Y1 P, D
! g- F0 Y$ h# J6 ?#define SHAER_RAM_BASE_ADDR (0x80000000)
- I& Q7 U$ E( `, ^# g; \6 G2 { N" D5 N6 S. m6 ^# {: B/ N6 e
typedef struct2 c: [8 p& S6 ?& r. F- g
{
8 {7 X1 s% c* b4 u unsigned int a;
4 D1 c0 u) d& d! C. l7 o unsigned int b;$ M; a8 `8 r1 v- Q K
unsigned int packet_cout;% Y J/ P* A' R! |& J- \5 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 m' K1 i, H2 i; p2 D Q
. @3 S v* P+ i/ w/ J" ^* @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 |9 B8 c$ v! V) o1 h n% o
unsigned int count_copy = 0;
3 Z ~* F& I& |5 O- {, W5 n5 P3 f3 n9 A% \
1 ~ p5 v! N' }' v0 B9 jint main()( w1 ?% L9 C( |& u7 @7 M
{/ b3 K8 }) Y) D$ s4 c; ~* ?
pRX_MSG_PROTOCOL pshreRAM = NULL;$ Q. @. u. Q1 [# L( P: @
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# ~3 U* Q, P; w& Q K
7 _! L) v8 _) \/ K% B4 R7 |
while(1)
$ X+ }4 I' [9 p( @ {
t2 K& ?) k+ g- _, S) p read_MSG_buffer(pshreRAM);
$ v, w9 a* }1 s- {7 P! v }
1 @. W8 g/ G3 P; e4 n6 d- P4 ~}; }3 Q3 ~4 o8 F7 b( S
5 {: _; a, [1 R3 s2 _1 C% Y# {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 R" h" B8 x6 o! l
{
: @8 }) [/ e o RX_MSG_PROTOCOL buf;& h# a8 U% g; p9 k$ j
; H: u, V) }! [! ^: x" \ }
buf.a = pshreRAM->a;* J% o+ \7 B- W, g: ~1 L
buf.b = pshreRAM->b;
( {& \' a* h- b3 w2 d+ l buf.packet_cout = pshreRAM->packet_cout;
- y, h0 j% t( z8 D9 I2 X+ ~# |- r . h6 Q8 X: F2 ~8 N% L9 d
if(buf.packet_cout != count_copy)* R' x4 U7 h9 ~! E# H2 ~7 @* M
{
1 Z; b+ M1 J4 t) M. ? printf("a is %d\n", buf.a);. m4 K# w! ~0 P& w8 K, C2 Z
printf("b is %d\n", buf.b);. i; m! ~' Z& s; Q2 V, ~8 G
printf("count is %d\n", buf.packet_cout);
; t7 N' y" v4 V$ ~; L count_copy = buf.packet_cout;/ K X) y; q- U" k7 V- G9 p m. J
}
0 v$ n) g x3 s" k/ e else2 i5 L9 G; g/ T; c
{
+ Y9 h" @! ?' u1 p printf("No effective message!");
8 S+ l Z% I, a% R }
) O" C+ q( n5 K0 P1 j}
9 Y% b% _: P' ?% S3 ~7 F1 @) v' X" C, R
' a F) Q" b% g% Z, ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 v! S1 y# C7 ^7 \, `3 W6 w7 z使用下面代码,对内存使用了mmap函数后:1 i2 ~3 W+ \% M5 `7 `9 H" j9 h$ g
#include <stdio.h>7 E8 E+ d6 s/ L/ h/ p( n
#include <unistd.h>
8 S+ K4 B% Y7 C$ s @#include <sys/mman.h>
* x3 ]8 I5 Z9 P2 j ~#include <sys/types.h>; M. Z/ a0 ^- n* f# r; A1 X( ]
#include <fcntl.h>
6 h8 w! A) g3 F& t
: l X. r. \: P4 R#define SHAER_RAM_BASE_ADDR (0x80000000)/ |/ b9 p9 p9 V2 l! b9 D
#define SHAER_RAM_SIZE (0x20000)
1 R& I- F. z; s" M* d( O" Z
1 R: u: `- B1 Q& w" Qtypedef struct
3 l* @9 i: }* s# t* `$ f{5 I9 z3 L, w' Z8 t* C
unsigned int a;. c8 S+ g+ Z3 @) T$ [
unsigned int b;
- Z1 M7 \7 r Q/ P- ]4 e unsigned int packet_cout;
7 N* y* a7 ~. j* [}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ D6 U I' L2 h, _" W( {
- B# [7 d' f% L# t8 L: R2 `
void read_MSG_buffer(int *baseaddr);& _: ]8 B, l& T
unsigned int count_copy = 0;
0 g6 i3 X* J. W* X# T2 p& ^0 G/ o
: l& V4 R+ R4 z3 Dint main()* {4 T) d5 T% K/ g
{/ ~, i) Q4 W8 l# `( X0 U; w
int fd;
+ ?" k. W; \( A K! Z2 x int *mem = NULL;2 a' @; }3 W# c: H7 q( A) E
; k" b+ D) @/ X
if((fd = open("/dev/mem", O_RDWR)) <0)
) z( Z7 o, V4 ]% L+ c* R% c {
1 k! C2 W+ Y7 E perror("open error");
9 z$ w+ c# z/ s+ V) ` return -1;
1 U/ }" O6 K6 z; x* G }% a: d7 y* P% p) X( A+ N# d
% n+ G8 A2 p. J* Q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& N s! S p3 c$ ~/ u" e
, w3 a- n# y7 h* y5 q
while(1)
( j, x5 N% i8 Q {
8 |! @+ ?; u4 V read_MSG_buffer(mem);
7 i& M! c/ B' i3 M9 o; A1 @! M } h' c$ D- b+ z% T
}% o% p8 f3 U0 e" q. t
; w0 r* [9 d" R+ J. M; ?& F' _& a+ _
void read_MSG_buffer(int *baseaddr)
6 n1 L4 n, N6 g- I) X4 s4 M& J; v% Z{5 q* c4 B. F1 w
pRX_MSG_PROTOCOL pshreRAM = NULL;9 p0 r8 W4 G! n* B4 p
" I& R" R8 m* Z. e; n9 y0 }6 r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. ^! e1 \0 y: k |
! ~$ l" J9 l% z4 E4 K( k* m if(pshreRAM->packet_cout != count_copy)% U* \( Y- M! j6 E6 @
{
. A: m2 m7 ]* a/ y printf("a is %d\n", pshreRAM->a);1 {) H' v* Q. u" k2 [0 B
printf("b is %d\n", pshreRAM->b);
/ h, P1 c! i" I: ]% W& ` printf("count is %d\n", pshreRAM->packet_cout);
6 `8 O$ w! D' c- U( v8 j count_copy = pshreRAM->packet_cout;
0 m9 f1 y. t7 X$ e: X }
, @8 ^) c5 j2 {: [: P3 y3 V else$ W4 @5 N# b) I
{2 p# _2 |1 N1 R$ @, S w
printf("No effective message!\n");! Y1 ]) q5 b" p! b c
}0 o( D, l; z) z0 S
}: p7 O# M4 ]( p9 }. }
! t0 d! t. P9 g5 U$ z+ t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: V, Z* k8 {+ y9 ]2 _+ t+ C4 S: ^% Y l5 ~% s* K/ [. b9 X
* u- G, g# N0 K* w+ t/ B P3 o3 v' A7 N; P9 O g
$ Z. M5 U2 |0 ]3 f! n& I+ m8 N3 u
|
|