|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " |+ m% F) O! h
4 W0 V: m9 L4 y8 \, I4 T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 f4 e/ \6 O8 _5 H2 y& r#include <unistd.h>; n) I4 S# Y* i$ I! [. C9 n8 r% T
#include <sys/mman.h>/ O8 z" K; |3 ]. ~! m. t+ ]. f
#include <sys/types.h>
9 s5 y; m9 K- m' w: [#include <fcntl.h>
* I; N( M( p4 }5 d: L5 B+ U0 B8 k/ G: U6 r& F- K7 t& W6 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
; ], b& y6 E/ U5 ^% l6 D! k; ~& |( u- n" m: b( E7 W, |2 ]
typedef struct
: T3 R2 L& w, S1 E{
$ p. N& \$ v/ S% L6 y0 U unsigned int a;
; w; E. x' q: F5 q unsigned int b;; X6 b0 b1 a) ]8 V
unsigned int packet_cout;: f9 U8 Q# _6 O* A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ w/ x$ R$ r5 f& }* ~5 S
) ?5 d: L, z# d! R& u6 ]/ ], [% pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ N0 Q; {: c# K; vunsigned int count_copy = 0;
8 b( Z/ I2 P" m S" b. H
% m) B, w6 u+ w& k1 k/ A5 {; A
( l/ P+ |9 D) {4 Dint main() Q% y* u D! y/ s; i
{
7 L& a k" p: Y3 Y$ n7 M pRX_MSG_PROTOCOL pshreRAM = NULL;$ B! P6 K" @% ~+ k Q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ ^3 Z# M# ^% y* M7 y; a$ Y, h( [
9 P, H8 t) ?$ E# A$ h) a. z7 [
while(1)
. m# \2 x: c2 @' J" v& v {
. h1 t' x. u A# w) |5 X read_MSG_buffer(pshreRAM);9 S, E3 @, T, J
}
7 a% o0 {" k7 O}
8 C: g' w. w) M$ U) P" ^" A/ f; P; {: z) r E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); C8 P! D# J' O8 B) y
{
" c; B/ u& c/ W) T. T2 N/ W RX_MSG_PROTOCOL buf;& }) P) E. q# P! {
2 {) @* Y) k4 \* a# X9 L buf.a = pshreRAM->a;& M$ s$ u0 N) e2 u% O) @& X/ w
buf.b = pshreRAM->b;# x# J* [& c0 O# ~% g
buf.packet_cout = pshreRAM->packet_cout;
4 K/ ~2 ^# }2 m" ~9 s2 l $ \/ I1 I+ Q" k; a* W1 w7 N9 h
if(buf.packet_cout != count_copy)
# h" l# `5 ]( |0 k3 ? {
* Z! T* p( U- b* O: q printf("a is %d\n", buf.a);
: A5 g* g1 j. F2 e8 u4 @2 J printf("b is %d\n", buf.b);; C1 N; K& N1 T* M+ `: G" ]- C
printf("count is %d\n", buf.packet_cout);( U! W$ t. b+ ?- G: K( r+ f2 l8 M, ]
count_copy = buf.packet_cout;# r8 [& S5 Y3 P" G5 x2 T$ c
}
! N* |' j2 _# ~# \/ E% o7 D else( u; ^& Y9 r/ ^
{0 C1 K6 ` e( i
printf("No effective message!");
) g6 F: k. b. o1 h9 x- S. { }: `9 u: F# m1 X% x- x: v
}$ x8 _ P) T" m2 v3 V, d- S5 _6 o
: r0 {0 G, Z7 c6 Y6 z* A( S3 h( Q3 X' K; ], A" X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& I3 m/ p# m& q$ c/ z6 `5 j
使用下面代码,对内存使用了mmap函数后:
* t3 t: }2 Y9 j+ H6 S& q#include <stdio.h>5 U; x, }. n5 D5 _
#include <unistd.h>8 i8 x# [, ?2 q8 }1 C/ w
#include <sys/mman.h>5 a: ]- J* A* \! U/ L
#include <sys/types.h>0 H( v3 E' b7 n# S
#include <fcntl.h>. t W( F5 J8 c" a* m
& v% g$ }5 O N7 j#define SHAER_RAM_BASE_ADDR (0x80000000)6 B1 _+ d: M4 \" [% s4 [3 y }
#define SHAER_RAM_SIZE (0x20000) 7 `% a- N0 c0 w P2 K8 x
7 _4 _; X: }: L: K8 Itypedef struct
' P. P, n6 e1 i$ v6 ~{
* {9 Y5 I3 s( v! K5 c unsigned int a;
$ b1 e5 M& B9 J/ z0 V. y unsigned int b;" T" Q5 {& w( y1 E, z
unsigned int packet_cout;
" x" s7 I! J1 }1 P4 ^1 X3 T# W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' B! B/ P# L3 I: Q9 i
% S, x, M5 H% K7 x( ]8 bvoid read_MSG_buffer(int *baseaddr);. \4 j( \/ U/ @0 P5 T& l2 r
unsigned int count_copy = 0;! b% }( N' {& i
. \6 l3 J" g' u8 l0 h' b
int main()# \- f* @: O7 B n) r* T6 v6 @
{
0 N# C. z# M$ \# |+ X$ }- D int fd;; U2 R3 ^" W, j2 k( q4 h' w$ W
int *mem = NULL;
0 q; {& _' V/ X7 w x" e2 G
, n# n, e! k! }$ A3 _ if((fd = open("/dev/mem", O_RDWR)) <0)
& d* }# ~4 h7 c. t' E5 f9 _ {
. x2 G" o( |6 D, V4 O. W perror("open error");
( K/ N" K% P+ \9 c return -1;) O. q" W' z! O
}
. v9 Q0 N) e& z* p
8 \8 o( h5 u6 D8 J mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ h- e' o( g' A% H/ o0 F
" ~7 `+ r; m' r( c. P while(1)% ]9 v& |0 C0 K4 H7 y
{
( [, P9 c8 G/ [/ Z0 ^" |! ^ read_MSG_buffer(mem);
* ?- k1 H+ E4 x2 a9 w) @ } 7 F8 e* g9 l' M$ X
}
9 g: q F- b3 @& N
) S# f/ Y% j8 q/ b6 X: Zvoid read_MSG_buffer(int *baseaddr)( X0 V1 S3 x! w$ w7 E
{
9 }( S4 t, {' c. j0 S( Y pRX_MSG_PROTOCOL pshreRAM = NULL;) d- |) b0 c+ V* w3 b
+ f2 k" |. ?3 ?4 @9 m: L pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: }8 F9 v+ n/ g, G0 ^5 k
1 x% }& J, d4 L# Q3 N3 ? @) y5 c if(pshreRAM->packet_cout != count_copy)- A$ r$ Y. n4 @# z
{
$ T' P9 ~+ H3 C0 J) e; H* s3 j printf("a is %d\n", pshreRAM->a);
4 l$ d4 v7 v& F printf("b is %d\n", pshreRAM->b);
' P h( Z. i! U& T) N4 v' K printf("count is %d\n", pshreRAM->packet_cout);9 ?) u4 Y! g0 y5 {
count_copy = pshreRAM->packet_cout;
7 |' R$ W% L+ n5 y. @; K4 X }: U: b6 |! |8 ?( b* n H
else: l7 a1 w0 ~ _% _& n7 Y7 l7 t- p" N
{
" V9 h7 |7 i+ A. I2 \ printf("No effective message!\n");- H% S L* I) b
}
2 H% h) w* D0 X& }/ d6 G}
! y) k/ }7 J" o6 e! M5 D) a& s6 g3 I7 i: h
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 {- a& i* o+ N: e @( x9 J; W1 U8 o- t5 Z4 E4 U- Z& V
! q) @5 c0 R* b1 }9 [) \3 }
, c3 K$ }+ _+ ^1 L0 D7 I
& z) `( M9 i8 M5 T. v2 u |
|