|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 v ]4 \, a f9 n1 p2 [$ ]6 }1 P
; t% H4 T, B; p: `) h& {9 H k7 O1 OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ E, J: I5 \6 X- M5 r* {#include <unistd.h>
) b4 N* A. G0 h3 ]% _#include <sys/mman.h>+ [, s- Y0 _( G
#include <sys/types.h>- C* _3 H; ?8 T- ]4 \
#include <fcntl.h>9 s. }6 ` e' v" D
, W/ q( ^; s1 r
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 }# F v/ T, T' Y6 W5 h
2 r: S: D, u5 P( etypedef struct
# |) [8 i0 Z; K: }1 T{& P8 q Z2 z8 h
unsigned int a;
$ O( E7 |6 ^; p% c" Y unsigned int b;( J- T2 y: e9 X$ q8 h, f
unsigned int packet_cout;
! f4 `; K/ c, f$ E0 u% g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% g, j' g9 q. D0 e7 A" k7 E" k7 X. b0 b! d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. M" {6 I( R0 V( L. r: r; aunsigned int count_copy = 0;6 f0 |( S$ f% h1 M- q, H* g( T9 @
2 H1 f2 S/ j( u. G
% M+ |) E. w, K" P7 f* y3 @1 T
int main()# ~7 k. w. [3 |) a* w3 j$ S
{0 _; z/ s8 r+ X# L+ \
pRX_MSG_PROTOCOL pshreRAM = NULL;% a1 X- M5 ? l, g5 U0 g
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ Z7 N- H, y0 n+ R' z0 W' ^
. b+ [/ G: a0 H: |& m while(1)3 c- G9 O! G' Q- z- s. T; Z: c
{4 `4 Q6 `( ]" p4 {
read_MSG_buffer(pshreRAM);% j$ V( I& @7 T) ]7 p
}
. y2 D& U: |! [+ ~( e}) C% }% l% x7 v7 F
& w# C, u. k3 jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)# F; I1 ?' k6 @
{
. D. B+ d# H8 i) y RX_MSG_PROTOCOL buf;
0 T9 X8 K5 z% e! h1 h# Q
3 h( m! v% [6 L buf.a = pshreRAM->a;
, S* G7 T0 D S' J" j; @$ ~ buf.b = pshreRAM->b;
; v, S& n0 W; u5 K' h2 l! w buf.packet_cout = pshreRAM->packet_cout;. `5 z$ f) s9 V# G
) r: S1 Z2 U0 M3 N9 R if(buf.packet_cout != count_copy); T5 q! d/ ^& E; g p$ n
{* L) l9 j. a; w8 B" Y( T
printf("a is %d\n", buf.a);/ ^5 k2 S1 y' j. n* g7 M! |
printf("b is %d\n", buf.b);
7 k7 `8 }# e! T printf("count is %d\n", buf.packet_cout);, u) H6 Z S6 i: H
count_copy = buf.packet_cout;
% K, v5 Z$ r+ z }
8 }8 [, d5 K' f6 s1 C4 V else y F/ J2 B6 U* ~
{$ g. y+ |* K% F5 _- P
printf("No effective message!");
" |5 B& W) g+ g7 [, X }
. n0 k2 }# e; v- K4 I& d}
! U% [; n9 o5 Q% e! i" I. l" |' g& y: e" d
2 V, k5 E, f3 S6 A. C- y3 E& m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( D# e6 S+ `" R# s* }使用下面代码,对内存使用了mmap函数后:& e" [' v" g4 i- K9 z. l( P
#include <stdio.h>
& C# n/ ?( J$ U' |8 r* e* ]5 q% C M#include <unistd.h>
. X' r- i, i5 t/ l( x" N& L#include <sys/mman.h>* t; P, @$ r/ p& \
#include <sys/types.h>
& q3 q+ T" f( M9 [#include <fcntl.h>( q" y. F2 {0 O( h+ r) O5 q
% a; o5 ]6 V' N% u0 y/ j2 C; Q# Q#define SHAER_RAM_BASE_ADDR (0x80000000); d S0 t" x& b: m9 c
#define SHAER_RAM_SIZE (0x20000) . w' y) j' }$ J! K- z
3 @+ g& H3 ~# o+ l! [! rtypedef struct) E& p2 q! h6 R* J9 u+ t) O7 K& S
{
9 g1 [% U$ ]+ Z e: O$ I. Q unsigned int a; b, J/ H9 l* z
unsigned int b;
! [7 ?, H# n2 s$ P( s unsigned int packet_cout;
# p: |# W, X3 M. z; H$ A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 r( ~9 ^8 k8 R5 w
# @/ z4 q1 u$ F0 Y# \
void read_MSG_buffer(int *baseaddr);' d! y9 H/ ]( V
unsigned int count_copy = 0;
# U1 w9 \7 a& @6 ?! q( \2 {
- K$ }+ J4 `, U. uint main()
, c0 q3 @ Y+ I{- D( s6 F: b6 _
int fd;5 k* `; ~. Q6 A: O- z6 }% G( M: c: v
int *mem = NULL;
* t5 |4 A5 x$ K7 v4 C3 i# R5 K7 l) ~' b6 T5 H# h& A
if((fd = open("/dev/mem", O_RDWR)) <0)
7 P: L7 ?) ^1 a& m9 ~8 U1 l {) ~* I$ p% i& E n6 z9 ?5 h& s
perror("open error");
7 p w4 h( U ], @, c; ~ return -1;, H7 C/ S* e+ m! s7 ~6 [9 t
} C3 |! {- m p: E/ Z, }" U
2 ^% Z! Q# O6 g' I! p4 X& O- A
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( V6 r4 T- P/ t2 ^" i3 S
8 {: w5 b0 O/ e, p+ W2 k! p while(1)" u+ e2 t% z8 ], j0 T6 F2 g
{
; r, R; q2 G. X( \: S% I3 |. H read_MSG_buffer(mem);9 E' F/ u# ?8 E2 q+ S% d
}
0 I# V8 z) u4 h- Z5 Z' {! A}* I, j ?. a' y" X4 p
& q. f8 ^6 ~& S: b2 b& F: x+ H% E
void read_MSG_buffer(int *baseaddr)
' m9 K+ X) ^0 }" Z, [: s{
3 U9 @& Y' `) X1 Z. G @ M* \ pRX_MSG_PROTOCOL pshreRAM = NULL;
! V Y9 J6 S d8 ]. U" {
8 M0 j- X, x# E4 n4 o# Y- g pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. V# c2 ]* T4 H% D$ q- y+ l
7 e! i t4 ?3 z) | if(pshreRAM->packet_cout != count_copy)
$ s7 ]0 ]$ ]1 b( Y1 U {' P! L! P! i. a8 d
printf("a is %d\n", pshreRAM->a);# ^" k& Y' d/ M/ t
printf("b is %d\n", pshreRAM->b);4 _! N! D- X; Z* l
printf("count is %d\n", pshreRAM->packet_cout);
`/ Q F Q' L9 m: M. }, o: m! A count_copy = pshreRAM->packet_cout;# J. {6 |. \1 ^+ ]& x2 r
}
- E+ g7 a% }5 S% ~5 X else
* a$ T4 `! Q8 t9 i {0 e+ L% M0 W! |) w* A% F0 b2 P
printf("No effective message!\n");
) _0 R: q7 C! K6 J }
X2 N j) R- b; }6 ]# u) ^: l}
/ f9 f8 u. k1 G+ t) v& d# m- T3 L3 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" [0 B& h: S) V3 I* r. \4 v' P$ u# W! p3 d, E& F2 B
( ?5 j: p( n* j: M0 L" I
1 p8 M1 b/ z4 b/ I
[! l7 O2 j. [, z7 [ |
|