|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 M+ F! g' p/ Y3 l
3 F4 f7 j4 Q2 z) s4 H; L7 [OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; w; c; F5 u9 }2 b9 G5 s# Y6 X#include <unistd.h>
d T0 O0 F/ b& z4 t#include <sys/mman.h>) s! q5 K7 [0 b# Y( t
#include <sys/types.h>
( k0 H5 e, {5 X2 X5 P/ l#include <fcntl.h>, k4 @6 @+ w: w6 z7 f" p3 m
& ~# K3 a2 g9 _# C2 \6 v+ Z#define SHAER_RAM_BASE_ADDR (0x80000000) & u; U% h- }8 d, {
2 k5 {# F, _" e5 f& c% _
typedef struct
" Y5 M9 a! ^" D0 ^: Z4 c{) ^% { r5 u! o2 h
unsigned int a;7 |5 d& l' d1 o: o( h
unsigned int b;6 G8 ]$ ~: r. y, c8 n3 [! a
unsigned int packet_cout;
3 j- s6 W- x& A, H2 s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 Y7 b* `, h8 k" G2 M: W7 i2 m/ S% t, i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% t& N8 Z8 m% c" I0 T9 w5 m
unsigned int count_copy = 0;( m% K2 }& m: S7 ~9 ~8 f; K
l/ i) J/ o/ n
4 C" T% W( i- l$ rint main()
! K+ `3 R) J% e0 `0 X4 P{
- U$ J8 l" b h% {% R; y' Z* C pRX_MSG_PROTOCOL pshreRAM = NULL;, w7 q& S. ]( L0 S1 m7 a z- P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 T3 K- x7 i; m% ^; ?
9 {' b ]8 H; k8 h& F7 m
while(1)
- U" _5 Y4 U$ S2 I* R- h6 E% B {
5 n v4 I$ |& G1 P! _ read_MSG_buffer(pshreRAM);
, s' e* ?' `( l5 I# i7 f; i, N } ; ? ^4 V5 N. T' v5 w" G
}! R4 F/ }; h# @6 M2 g9 c) g
1 A7 B# Z+ n8 m7 l1 c- q _( vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- f& T) z5 e- k* ]* q- C6 |{
, o+ }) m' ^6 G! i% u RX_MSG_PROTOCOL buf;
- W6 L4 u! A8 z% l7 q ) r7 z$ k8 b, p: @' q" H
buf.a = pshreRAM->a;
1 \' Q; i7 S+ W1 p F5 t buf.b = pshreRAM->b;) O$ h3 O$ a8 ?% [2 W- K
buf.packet_cout = pshreRAM->packet_cout;
q8 l/ [3 {; G) U$ C. r6 U
& K1 V8 O7 w, j1 M4 F4 l! S& f) A: i if(buf.packet_cout != count_copy)$ P6 J* Q& C5 T
{8 S; y% G0 R4 R5 z8 Q
printf("a is %d\n", buf.a);! {, c2 H: H9 L# x; B* B! z# B
printf("b is %d\n", buf.b);0 O- ?% b4 h6 _# w0 K0 s0 B8 V# Z
printf("count is %d\n", buf.packet_cout);
* y3 w# b' ^, s, x, p- G5 y count_copy = buf.packet_cout;& E( |6 M; c4 _
}
" P! U4 W S6 g8 s else! @' v* P$ O; P3 A1 a9 M$ a. B& S
{# C! ]' e& b/ j
printf("No effective message!");
+ V1 W D9 Q6 U/ x, d! H }
7 P' \' i% N4 u$ ]}
$ E3 o, Y" h' @# d' q* V' ^& K2 `8 O' ^" ]9 o. t* r3 ^$ N. y- ^6 Y
( {3 O% R; S* ?* U$ e U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
c0 P x' C& B8 S# D使用下面代码,对内存使用了mmap函数后: R2 i3 X& R3 Y
#include <stdio.h>0 ]# I; ^; O7 `4 M: P0 @
#include <unistd.h>$ E. s7 j0 M# _6 X: y! p' @
#include <sys/mman.h>
) f5 [7 ?7 N$ u5 q9 y/ D2 H#include <sys/types.h>* D1 I p2 ] M+ {) Y
#include <fcntl.h>
9 h7 R0 P9 C9 r; H" x- J9 z A. d' y. a/ y% U! X. O
#define SHAER_RAM_BASE_ADDR (0x80000000)% T& B7 L9 w- j, ^) M( D
#define SHAER_RAM_SIZE (0x20000)
. s: Q9 o0 D: f( u, A* ]- H- ~( g* u
typedef struct
; z# x$ h, |) Z8 A x. n& u- U/ n% K{. c- @0 I P1 d/ K: H
unsigned int a; S8 @ P- ?% {: H1 p! E, t
unsigned int b;
& k" m4 t: d5 c unsigned int packet_cout;
2 f; Y9 N/ J7 i4 \6 M1 v1 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; v. Y$ Q, N8 ^( A, P9 R* r+ w
f) M; i' Y Y! S# D6 P; ~: cvoid read_MSG_buffer(int *baseaddr);
; W+ r3 }$ B8 p$ t0 C! T7 hunsigned int count_copy = 0;* g- ]9 J& [5 {+ Z
; N- }# g/ c: t6 w2 B1 i
int main()" y7 l+ `1 ], G2 ^+ }: D( A
{
" B- f& `/ J' O3 q int fd;* O; U8 c) m% ?& _. d) y
int *mem = NULL;
5 g1 D' U$ I& E7 Y
* j4 I' q- D, |/ R( D$ U if((fd = open("/dev/mem", O_RDWR)) <0)
2 P# j5 u) U; f+ R# D {$ j) }1 D5 y" a
perror("open error");
% e- v' z! \ a' J; v return -1;; ~' @6 B; x) X' O- S, c5 ~
}
; ^( b3 l4 N y8 K/ i3 n/ `# Y9 h& F
& J( T" R5 |: a7 d( J x mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# R @, R& d) o8 H, k2 Y- l- \
; W* H: c" R- v2 O) n% ]- S while(1)* t" @" H+ v! T" ~3 k3 T
{
2 y# K' t) Y7 @9 _$ z% S$ p read_MSG_buffer(mem);7 `1 u* ^6 f, Z5 V- r
} & z b% Y# U! q2 d
}2 a; @: x0 j( P) M! e
& `' F' G7 A+ t y: ]' R3 O
void read_MSG_buffer(int *baseaddr): I, e* l) D! f4 B. s6 l: E
{* w* M. Q4 I! [; X5 Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 y0 n8 }# Z9 T O' _. ]: N& Q
* M, v3 c1 N5 H2 _( l pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* `2 E/ L7 I# _) ]
a8 v7 B2 ]% C, l: l6 g4 N if(pshreRAM->packet_cout != count_copy)
) \ n' N3 Z$ J6 b3 f {6 H. U, U4 q9 n0 f! C
printf("a is %d\n", pshreRAM->a);
5 R. B& W; Q9 g/ l( y1 p printf("b is %d\n", pshreRAM->b);
5 ~+ c/ \ u' J" p9 D( e0 K4 t printf("count is %d\n", pshreRAM->packet_cout);" a% u: A, O" s/ \
count_copy = pshreRAM->packet_cout;# L* Y& N9 C, X- B v; ?
}
/ z: i" E# [' N3 ~; R) Q; g- Z else; G% n1 m# v- w7 A
{4 p N H l3 E( {
printf("No effective message!\n");
9 x# w& r; n" R# M/ V }! g+ i% k% q5 Z
}
( T6 z3 \! n/ P: K1 |
, b- k: \0 n1 j- e2 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 f( i6 }" @7 B. q0 F: u
' b, o/ o. a) I" a
/ k8 [$ o: p2 _) r- r! k7 X5 B
1 C% J" U I! v4 p4 N1 _$ S' z) }
|
|