|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 p' [# M/ r3 h+ T5 D; P- J( M. {4 D% a0 K! ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
r- p% I+ e7 k$ I4 p#include <unistd.h>
, N, w' |( y/ p5 L3 E( h u1 L6 p6 o#include <sys/mman.h>7 y8 _6 l9 k7 R, _/ |9 a
#include <sys/types.h>( }# V# K9 o o; |1 Z, [$ E/ C. A% l ]( _
#include <fcntl.h># Y% {9 U4 [& f% B0 y
% x- [; O6 D- j8 g. g#define SHAER_RAM_BASE_ADDR (0x80000000)
5 m% d' C k+ W4 m( H3 {! v% p0 D7 G! S% L3 L: Q! p( N+ g
typedef struct* \3 q$ I" T) d2 w
{: }& d, O: q& Z' A' ~
unsigned int a;3 l4 I3 C+ C. v% z+ e
unsigned int b;" w5 C- h" R4 y3 [4 G
unsigned int packet_cout;
% j; @$ i" J% }3 v2 v4 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* C. n( \+ q* r$ K5 N
% w% S* c! \( ]# m vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* z$ P( @$ Z/ X; G8 Tunsigned int count_copy = 0;' D1 D/ f2 g# ]5 f" S2 Z
4 F# n! @9 \7 }3 J4 q% n' g! }5 u3 Q" m
int main()
/ k( n% e+ Z3 K) m( H: `1 _{
' k5 U& r; H' l+ K. h, b# s! P pRX_MSG_PROTOCOL pshreRAM = NULL;6 e( m& n) J6 R! p" p6 U! z* }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 x5 C5 u- j! S5 {
" E5 f/ V; m0 D9 G1 |: a E( I while(1)
8 s/ g1 g' P9 {8 A {
g: O. s1 r' u6 [; q( _ read_MSG_buffer(pshreRAM);+ l7 O0 k& ~ ^7 X
}
9 j) e. e3 p1 @" z. a, s6 ]- [* ]. T}
' g" s. Q/ X T& h% ^! k$ N9 g& } C# v) x! ~9 v( l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 Q2 H7 v+ e2 F0 v- {
{
# D6 V9 R i/ r6 H! Y: H4 V; I RX_MSG_PROTOCOL buf;+ ]5 c- K7 r( S3 W) ]+ y! A
3 A3 ?! u! Z. s+ y! x/ k
buf.a = pshreRAM->a;/ f* ~, j. g( o' Z- G6 C8 A8 [
buf.b = pshreRAM->b;
9 g4 L/ F- H% e5 e# K buf.packet_cout = pshreRAM->packet_cout;
( b& d, B+ f' ]1 f8 v$ E/ n& G
5 v7 L* g( j* D5 B5 U if(buf.packet_cout != count_copy)
" i: ~. `7 i7 a2 V$ _5 {0 B- h+ p {& w. I3 h8 M7 k7 E
printf("a is %d\n", buf.a);
5 E8 B9 C; g6 R7 m) z printf("b is %d\n", buf.b);2 z5 g- a$ M: J4 L
printf("count is %d\n", buf.packet_cout);$ _$ d. V- W& }4 u+ P4 W' n
count_copy = buf.packet_cout;$ Z9 F# H R3 v) p9 F1 p3 Y! O
}- c' r& J; j A/ Y5 U
else* ^- R! B5 A2 Q8 z; ?
{9 b1 U5 g) {. u/ v
printf("No effective message!");
& v+ m. Z! b3 K+ w }2 P8 T% F, h2 V) z4 X( k3 F
}
/ s. h" p' c# F3 m1 t6 j, O* D; @3 n5 q# q; T, t+ _
; ~3 ?" R: S) g. d( ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
- s2 v; n' M/ P- e7 R* J使用下面代码,对内存使用了mmap函数后:! \9 K# A- ~2 V8 o; `
#include <stdio.h>* _- o# G0 D% {5 D3 ^7 {
#include <unistd.h>8 O! \4 h( M; y/ r
#include <sys/mman.h># n; _* X$ D5 u1 ]! V# K2 q
#include <sys/types.h>
) \! o4 p% w5 o% v- v6 D#include <fcntl.h>
, Q! V2 L+ z& t" Z: P5 _3 ]
3 z: o7 N! p6 M#define SHAER_RAM_BASE_ADDR (0x80000000)! \; i+ U5 d( u5 C% M ^2 K
#define SHAER_RAM_SIZE (0x20000)
& _6 n" q/ D' L5 V! a ^- F( M. N# c5 ^* j' j8 ~! C, {' \ c
typedef struct
" A5 O {& Q; f0 h) C& {" K{
Y; O$ z2 P2 @4 A unsigned int a;) s3 T& e! K% J# _* D
unsigned int b;
) | e$ a/ l/ q4 q0 K. _, { unsigned int packet_cout;0 A: Y$ z9 y' U$ T1 N# Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( f& I1 Z' w- P9 M
6 W2 a! i! X3 u
void read_MSG_buffer(int *baseaddr);
6 [2 Z9 v! O% ]9 Xunsigned int count_copy = 0;
4 i r' Q$ |. N1 \5 H' {5 K& O9 H: Q. C- B( S5 C! |
int main()+ n9 U) |5 R: E
{
& \4 c! Q: i% `9 f* h, y int fd;# y7 b+ f$ Y& Q9 X9 `0 R
int *mem = NULL;
6 j5 b, G5 F4 }4 y# m( R b. I, S: h6 K$ C: ?! e, ?" n
if((fd = open("/dev/mem", O_RDWR)) <0)5 v' m9 x9 {. P; E" |0 L1 A
{# x7 p1 ?0 P" J: r$ l
perror("open error");! f7 E* k& t; W6 R* s6 ~
return -1;
- F8 R7 H+ u/ l: ~: F; F }+ F7 ^- S6 y9 T& V) _
! a% R6 ~9 ^( b) F1 t- |) F mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 u. r3 t; x7 E9 o8 a
! y- d3 e- ^3 w& e( D" p while(1)
1 T9 q: Z# ~: [6 ^ }% c {" {0 {" D, l, q( g5 X$ _6 l
read_MSG_buffer(mem);. |# P7 p% w( _# _9 ?+ C2 q
} 4 A0 h8 y3 p5 y" |
}8 K+ [8 J# G# n; g3 [
. F$ D$ B1 Z1 E8 bvoid read_MSG_buffer(int *baseaddr)* q0 w' s }" L' R6 K' N
{
# Z8 x9 U/ {0 Z0 x2 h/ w. [ pRX_MSG_PROTOCOL pshreRAM = NULL;
. _# z/ g+ ]6 M3 J. z6 l' B: s3 a, Y$ w, A) y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! b4 I n1 `. d' ^
e2 z' G* f; ^2 f
if(pshreRAM->packet_cout != count_copy)
5 m7 q) P2 R* i4 o4 A W+ }" ?6 F {+ ?; T/ I5 c( h9 m. H% R
printf("a is %d\n", pshreRAM->a);
- n4 w. i/ E ] printf("b is %d\n", pshreRAM->b);) V: n) \( F O0 Y1 z
printf("count is %d\n", pshreRAM->packet_cout);# v4 ` f) j u- c3 P1 g4 L- @
count_copy = pshreRAM->packet_cout;
' i- [9 ~ Y/ Q' M6 ] }) N4 Q* ^- ^! z$ t: K
else
5 k% W& I7 c+ }$ ] {! [+ L3 W0 @1 d! @
printf("No effective message!\n");
" J- ~8 E+ t Y5 c& p }
R0 O4 S& ~ W- i: r}% q2 o7 B, c! ~5 p
. s( Q9 r6 @1 x; ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! `7 d) n' o a% O7 X* G* f
! N: F) x. I' f% x8 A7 n: g% H7 I4 Y# P
" v% y& N3 q0 ~6 |
* a) b5 f: Z- m3 I4 c4 {1 m7 i |
|