|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# s, }" Y4 h `2 g* B, e) d' L) I" {9 w: b* Z& U6 P, u4 H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 w1 y) l1 J) v
#include <unistd.h>2 ]7 W4 k7 k( r# d9 @
#include <sys/mman.h>
; V4 @" m% f- {- p0 y#include <sys/types.h>0 ]' L% F7 d) N7 | G( e+ R
#include <fcntl.h>+ ?1 t( _' Q3 C/ n7 O+ ~8 R4 c
+ e+ q# l7 e0 `' x#define SHAER_RAM_BASE_ADDR (0x80000000) & o; H4 n p6 O: |' w) d* G
' d! [% R" F; }' S4 Ktypedef struct1 s j' M p K1 E9 U) e
{
( C" W. L9 Y+ F4 Y* ] unsigned int a;) Y6 d7 b. L3 m. P
unsigned int b;
0 c" p8 H' T+ j unsigned int packet_cout;" B4 S0 l' k2 Z. s; \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 W: s2 c# _! P A
) r1 {# v$ h; |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& y! J6 y7 n* k" C! @! w) dunsigned int count_copy = 0;9 m/ t. U% C$ h; U+ A1 f9 b* N8 _& l `' c
[; b% R9 |6 w/ _" D$ g5 @/ m
' _* w5 n0 F0 d% N. _; w+ a( qint main()
& P( b. s2 y/ Y# F: J5 X1 r5 J{
( {$ K3 D6 v; e5 D: {) o pRX_MSG_PROTOCOL pshreRAM = NULL;* a) h2 _1 }" K( i% {: H
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ _& V3 ^; o5 a# l1 Y
1 g: p/ r+ }0 f* \% E9 ~& B3 b" A while(1)! H, L7 w* I7 t; G) ]( b1 Y% n/ P
{
% k) v& T7 U( K; _8 W% k: n read_MSG_buffer(pshreRAM);
8 s0 L, N, O. L. O, p' G } ( `) s& [. E' S n8 }) N0 O, i5 W
}
& n$ E6 ~9 f1 y7 c) d8 Y
) M! i, m$ s& @: y" S- J Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 @ l1 d. O9 i5 ]. H{3 h+ Z7 C2 h; K% x/ W( `
RX_MSG_PROTOCOL buf;
$ K% D3 ?$ d) h1 @5 z
' l5 L6 _: E. E% y buf.a = pshreRAM->a;* j3 H' ?8 ]' C9 N; f9 I! U8 i
buf.b = pshreRAM->b;# p2 |; o+ U. z* X* S8 D
buf.packet_cout = pshreRAM->packet_cout;
6 g" ?% p, X6 a# [: v7 ?8 N " q& V3 v$ b0 M9 I$ ?9 Q% \
if(buf.packet_cout != count_copy)
. M6 @) n" V5 x {/ [( D$ D6 P6 j1 P4 Q
printf("a is %d\n", buf.a);
, s2 X, c$ r1 v printf("b is %d\n", buf.b);" ~7 z+ S" m2 ~% X+ {
printf("count is %d\n", buf.packet_cout);
. V# q7 s* `2 \) W: n count_copy = buf.packet_cout;) `1 K* r- Y8 V; z
}0 {9 d- x6 D9 A' ?
else: X4 v2 Z' f2 i! Y: N
{
. y Z- R8 d: D3 R2 M printf("No effective message!");" b3 S6 M. M0 F4 _8 L" T. u; k3 C
}
9 S& G0 }# c" Z3 H6 J. y; y}! J* e( i _" H3 M8 o
3 [3 F+ G8 x7 P7 u' E& w0 ?0 a) M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% \4 Q3 ~- R# E7 S5 R使用下面代码,对内存使用了mmap函数后:! e5 c; g+ r, F2 v0 a
#include <stdio.h>& d1 \4 f7 E5 y( f8 K
#include <unistd.h>! ^- N4 \, d( Y8 k
#include <sys/mman.h>% t9 J) x- g& I% B
#include <sys/types.h>
, _# p# ]; t" s: M#include <fcntl.h>" T G- l, j5 A# h
2 h8 @$ M/ f) P/ O5 S/ b+ }6 |. T0 w#define SHAER_RAM_BASE_ADDR (0x80000000)( A+ V) L4 D1 G0 v, b- Y, Q
#define SHAER_RAM_SIZE (0x20000) 6 N0 Y( Z* \4 ]8 X) o; U0 O
' N5 z: y# P1 c
typedef struct% y3 H2 ?$ {/ Y- Q( r; l0 J2 _
{$ j! R9 S- L; [( p8 `$ r. @; d
unsigned int a;+ Q C3 p! Q% \1 C- l! y
unsigned int b;# k0 ?" e0 e3 H
unsigned int packet_cout;
' U; T' x9 I* D1 @, Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 ?7 z0 J8 I, h0 L& J3 E3 L( X- ^
# z( W5 |- m5 X+ C$ T% wvoid read_MSG_buffer(int *baseaddr);
2 k( T9 T8 V# @0 b" \+ x- Iunsigned int count_copy = 0;
! S6 s) P8 x9 r' N3 E
4 p" m. s% D* [ y' |! |int main()6 K' `2 K$ {* C! q9 v5 @
{
8 y4 [9 N# ], D* | int fd;2 R$ f% t+ D& p/ Y& Y, u& S6 p
int *mem = NULL;( q! l0 h. C5 Y) c- e* I4 a
" K2 Z% [7 M x0 K if((fd = open("/dev/mem", O_RDWR)) <0)
8 @& d4 @5 ]/ {0 Y {
( J" F4 m5 K2 U8 W5 i3 W perror("open error");
2 ^7 Q) `: A9 f2 P; p return -1;
" J2 O# F- o' B. D4 K }
2 P1 W1 l ?* C8 t9 d; n
. n! _3 `0 H; M) n& U F% ]! } mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! ?( H9 j1 @6 d' F
5 G) o: G5 e: ^2 r8 m! B x% ^6 ? while(1)
8 f3 T( T! H* b& p4 ]" n- [ {
) |& x5 Q% R3 {( e9 D5 S read_MSG_buffer(mem);* k* ^) x& ^* \/ g }" R( j
} * G- G6 j( _4 X; ~# M$ g
}5 @6 N O# Q& F+ o# K
" U& a" p7 D3 }2 S* p
void read_MSG_buffer(int *baseaddr)
# G$ e2 u% ]3 D; C& |$ _" ]{' C- V3 L9 g8 J' h0 R
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ R9 C% d2 J! C# C2 a0 C% |
+ R: w6 m7 q/ o- w' r# o5 ` pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 F. p5 \0 c2 R7 m$ Q: ~3 u$ ^3 R# \- h! _* v) u
if(pshreRAM->packet_cout != count_copy)
A3 b. R! X2 D/ R( l {8 O" x/ L: \8 ~
printf("a is %d\n", pshreRAM->a);" Z8 ^8 l6 J* z/ t9 o
printf("b is %d\n", pshreRAM->b);! [2 [8 S1 c# Z+ T7 q3 f* X
printf("count is %d\n", pshreRAM->packet_cout);9 s9 a4 L( a' u* r+ [* _
count_copy = pshreRAM->packet_cout;
5 [# `! B D( j% |5 R8 I8 y. c% E }6 d0 ?. x# P/ Y6 q; y
else5 l6 `0 t/ F7 @6 ?& E3 L) u
{6 ~# n0 }3 o- F! s9 R' Y
printf("No effective message!\n");9 x/ ]1 T* G! f u- X3 l* o
}$ P; U2 B$ M1 ]2 S, @9 V
}* I! R1 X& t* {5 a
7 L6 ]7 U% U j- j- w% b- I+ ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. y% {, o+ T4 J- i
; A5 Z; d2 p5 O: F
! ?& d- m. T9 T6 X0 u4 W
9 a& C. B( C; W4 X- Y9 x
, E# c K6 K5 o& h3 b |
|