|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ Y) _( T3 o" v x. A
% [* \! a0 v0 H$ U, T# `% J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
T# j+ G# l' W# _1 f) v6 y+ J0 G4 H#include <unistd.h>8 G Z" c1 r# i2 u9 W; A8 x! P4 v6 [
#include <sys/mman.h>7 T- @5 q1 r: ?! r [3 M. h$ d
#include <sys/types.h>
4 t' H9 n/ n; I#include <fcntl.h>
5 {( U' L) r- k I& ^5 R% v) m' H4 b- M( f" `
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 w6 w# }6 m0 T* m
, V2 B4 }. A3 V7 v" Ntypedef struct
9 H# K% P# U$ J{
4 z6 i; M* _# p4 h unsigned int a;1 K& [2 ^( l4 Z! g$ o3 K7 }. ^
unsigned int b;# f8 F) s: m3 v/ P/ ]5 P
unsigned int packet_cout;
# b9 k* e4 Q/ N5 ^% h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% z9 J# b) u/ ^1 V% f& L
+ R/ i! I0 ^5 w2 j0 }3 a2 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* J' z, F) F! g) p7 K: q8 A
unsigned int count_copy = 0;
/ I n2 e( H. X0 u) Z/ B2 x6 t* r9 r# y3 c$ n6 [; q8 y" P
) S8 X" S" ]0 w% p8 c0 H0 k' p, g
int main()
: E# P& r" F6 ?) z% X5 \$ W/ k* o{
) g. M% d. z: n+ g pRX_MSG_PROTOCOL pshreRAM = NULL;( A9 v9 A9 e1 z! ?4 u/ A/ O0 q+ `4 n+ e
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( x* U* H {% T
7 y2 I3 Z, v" _3 g0 s0 u! N while(1)
7 |6 m) e* l/ A C& V* U& O {
, m8 v( ^; P4 z& v0 O$ G4 C read_MSG_buffer(pshreRAM);
6 a' d9 E+ A# C' B, H, C8 S }
; t0 M( s( Q e- q- r& D}
* Q+ x2 k3 o' \ P- D. u+ ~1 `% s7 \% L2 |5 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 P5 I* l. c2 L
{
6 _8 r: X% v, @9 o8 ] RX_MSG_PROTOCOL buf;
' C: j5 ?2 O" v" J
) g! \6 a( a6 P$ s7 w3 V+ n buf.a = pshreRAM->a;! g; n- i* T: z8 y" w' j
buf.b = pshreRAM->b;
5 ]$ T9 x% P. e/ Z4 R buf.packet_cout = pshreRAM->packet_cout; q+ E) Y' u; X' Q K7 Z h
0 ?2 h( ~0 d2 L2 f, {' Y3 u/ q* G
if(buf.packet_cout != count_copy)
) Z$ {* ~1 ^! `0 R3 h" ? {
0 x1 o" y; J* N printf("a is %d\n", buf.a);0 E3 O/ j/ P4 H; s0 g
printf("b is %d\n", buf.b);
. q+ p/ R7 E t. L4 g; M5 `) N printf("count is %d\n", buf.packet_cout);, N; V1 }" {6 s7 h% e5 ?
count_copy = buf.packet_cout;
# }0 i, q7 J6 V; ?( y' B! v0 X }) s% J' J7 a- [, R L
else4 W, ~9 C: v9 d, ~: q
{
. u* N3 @0 i2 \9 {/ z) l* D printf("No effective message!");
' e# f! j$ x# Y) d4 y }; e4 t& Z& D: P& W+ G
}) @7 G2 Y1 g2 {$ \
! F& Z7 e2 j+ j2 E% a5 ]+ v! O
+ J; M) c. {$ o* Z' ]1 @8 p/ ]/ `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. |( a' a M! z# t& N- D* J' `使用下面代码,对内存使用了mmap函数后:
; G& [! n! E u$ ]+ j4 \7 C3 b#include <stdio.h>" b$ l6 v: ~* l9 ? Z7 ]2 J: A6 E& E
#include <unistd.h>
1 U) U3 h' C8 O+ }$ m0 o$ i+ n& t#include <sys/mman.h>
/ }4 d2 {# l% f. f' m#include <sys/types.h>
' l; S/ ~! R* d% b" {#include <fcntl.h>
: k% y% k1 F, ?! `! y% e
( k3 x: _/ @1 R8 A- m; w0 ]9 e4 Z#define SHAER_RAM_BASE_ADDR (0x80000000)* l. h: w- p+ R% d& H+ y) e
#define SHAER_RAM_SIZE (0x20000) ! O' F4 l9 n, t4 F( }' {3 B
, o( i' q! l' K$ g+ D: |0 f) b4 Dtypedef struct: J x9 u& S- i0 T( i1 L
{
! Z( v+ W6 Q1 A+ _) d unsigned int a;8 X( C9 _+ o1 i! y O+ E
unsigned int b;; s q% D% m0 ]% {0 `8 g
unsigned int packet_cout;
8 O+ x' n ^- X4 k) T! c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 C& P D0 g' m# R8 ~! X9 ]5 P* b
# m% g, Q: G3 G( }1 ~* I- r1 Q' qvoid read_MSG_buffer(int *baseaddr);, d( H# i) o2 O+ `( h5 U+ w- _
unsigned int count_copy = 0;
* X3 u5 x3 _+ [; D4 M) `7 y, R( R7 h8 y# w
int main()& I3 E( j- E' B: A
{' S1 r. a T+ q4 g# E
int fd;
4 I1 U P/ i3 K3 s5 H" G int *mem = NULL;5 I7 m& ?7 y5 {" ~3 M* S6 p1 g
, x# ^- Y9 |, b8 x0 [+ U4 ]- {
if((fd = open("/dev/mem", O_RDWR)) <0)7 z" t% c% B( ?7 \
{
" P9 g/ p0 G$ X- G5 R0 F3 D3 n perror("open error");3 c) s' L% F! Z6 g, @4 F" b5 u
return -1;
& o7 `4 r" y8 V0 B$ n0 d y }
2 }# y+ m& x8 [6 C7 ^: X' t
& J( M1 T& E4 h+ r7 | mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- J' S* Q1 b! g1 H3 E6 ]; X# L0 K7 ?
while(1)$ S! X2 U" B9 l7 o$ |+ E8 ?
{, \0 U& ? n3 T& ?# S3 _
read_MSG_buffer(mem);; ?6 w6 E" D# ~% n/ R& E0 h
} 2 V: @3 _: F3 Y* N
}
[, c( b; R; p L z2 j3 ~- H4 X( Q( L2 L+ v# D, a; ?$ S
void read_MSG_buffer(int *baseaddr)) M9 `: d8 Y& L
{
% Y. K' q" j6 A4 J& R2 Y2 T1 D0 m pRX_MSG_PROTOCOL pshreRAM = NULL;& v0 O% _6 E1 |# s$ b) O
$ o! [( y3 B( R pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, ~2 F+ A* v5 |0 c# d
2 A! \9 E; O0 o T, ]
if(pshreRAM->packet_cout != count_copy)
9 t" [! l" i: { {! g F+ Q* Q" v7 W
printf("a is %d\n", pshreRAM->a);/ P1 M$ k" K+ V& }
printf("b is %d\n", pshreRAM->b);& b! c* s8 J( L
printf("count is %d\n", pshreRAM->packet_cout);$ ]$ d9 O% g/ q8 X
count_copy = pshreRAM->packet_cout;" \% X, R; r. k% h# ~( |) e
}
* n0 V/ q8 y, z/ q else
6 O1 T6 R- h& C C {
6 m' r2 S$ U- H& J4 S* K printf("No effective message!\n");
' j$ g$ E3 A6 A0 K# ~ }
- T" Y( T) z4 L' Z) m}+ u* e/ ^7 L# i: m; C: |
a+ N9 c& H, |) P) N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& K6 z/ ~# B: s5 {
' `4 J8 g2 l: v% H0 d+ \- L/ M# F* X. e/ k3 e0 J
2 o h/ R) V0 g* C+ T6 k
9 x/ E3 q0 w- M b$ y4 E |
|