|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & c3 \! `- A" W
1 A2 r. y/ e3 R/ W; U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. _6 F1 p* Q2 i' U* _#include <unistd.h>. y9 n0 Q( r9 T7 E/ v( P4 M
#include <sys/mman.h>
- U- j$ C$ A9 ]/ f4 d+ e#include <sys/types.h>/ b6 w. N/ D, a1 r& V5 b
#include <fcntl.h>8 Z' f/ u+ [+ E
# Q6 O* X& K0 P
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 K* L7 n/ {! f) t3 f- c$ J9 Z7 E
4 t& Z& S8 J/ l8 w4 Etypedef struct
9 D# y) v$ ^5 C7 z{0 c, C9 _# A: x
unsigned int a;
" @ x* |8 ]! {9 O! H; ?3 c unsigned int b;
: i+ [) S1 Y r$ W7 m$ c unsigned int packet_cout;
- x) |: y* \2 e8 ^: K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; `( z: g# j5 j9 p
; }: @0 P, z* m( q9 pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 s& g7 ]2 ~% b8 Q4 e
unsigned int count_copy = 0;
# {# }$ M5 _; C# Z( C# E J- t. J2 v/ P) R
& _2 {" _+ e$ g) a# l2 G! Aint main() G) @+ V3 s. X! H$ g- L, R
{
$ b+ X7 i# \7 D8 F8 c pRX_MSG_PROTOCOL pshreRAM = NULL;/ B9 H0 y b% G: J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, y u# F0 r" E$ O0 j! t5 W
9 L3 \% w$ R- @" K4 A W while(1)- t6 E* T9 N- T0 X' [+ b
{
( `* G: g" S- h# m1 u read_MSG_buffer(pshreRAM);/ V m4 a: p( t/ n" A i
} , N2 }5 v1 C7 L7 I3 Z% A
}
% J, o; q( p! H% E% ~7 Q
, d' q9 ]9 g. C9 h L3 O! Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); D3 ~/ f5 K# b6 Z' O; c" i" B
{2 ]" z5 `& J. u# a4 M* {
RX_MSG_PROTOCOL buf;
; |6 g: _/ f5 f6 {; h5 P, k
' N5 S" ^3 ^# C7 P$ r5 K/ O0 a buf.a = pshreRAM->a;6 n z% R% Q- u( Z+ S6 ^2 T
buf.b = pshreRAM->b;8 e. A5 z- r7 }8 A; K9 i9 H
buf.packet_cout = pshreRAM->packet_cout;
) R7 F% a& K% L( m4 f& n% I$ E ' ~. z. T3 }# R/ c" T& @
if(buf.packet_cout != count_copy)
& \) ^( X( s) _( l2 X {( r: C0 X3 r$ \( ~! ?
printf("a is %d\n", buf.a);* G% Y# ]! `: P* h1 U/ `3 Y
printf("b is %d\n", buf.b);
. l, i/ o8 n7 Y( s" t- T; E printf("count is %d\n", buf.packet_cout);
% U2 y! h6 O0 J. e% m count_copy = buf.packet_cout;
' B) _5 Y& v H }
6 E f7 [$ @: l9 l s; l7 ~5 \ else, T8 W1 L3 R" I/ I
{$ D( ^# @1 f% N0 m+ U7 W
printf("No effective message!");
6 L& `- r" L$ B# Q W }& B, L5 \* _0 `/ O4 r+ ?
}8 G& C, a8 F3 u
. J* w6 g/ a3 o5 I5 R0 \ H# c5 U, e" [% f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 a- _* N* Y& ~3 i! X2 d
使用下面代码,对内存使用了mmap函数后:
, i6 j x3 H" k0 T1 h* u" E, V#include <stdio.h>5 ^9 }' z4 \7 W4 Y, f9 z% `7 }8 U4 @
#include <unistd.h>
8 I6 K" o2 J& L: ?; y$ L#include <sys/mman.h>
6 ^/ `; A) Q/ X9 H- Y# }" ?8 K& ?8 |/ s#include <sys/types.h>
& }, S; h5 u+ v4 `. j" s9 ^#include <fcntl.h>
" V, z/ J8 A& i' _4 Z
1 r, ^( F8 c1 J6 \#define SHAER_RAM_BASE_ADDR (0x80000000)) f$ Z2 i) v% N! V% v
#define SHAER_RAM_SIZE (0x20000)
7 H2 q5 O0 p$ i# U2 C- Q7 m8 T) E! C0 F; @' t( C" o
typedef struct9 L; @3 T: u. v* h
{/ }6 v' L+ B) Z1 |. `, q+ h
unsigned int a;" D$ I; H2 t+ c+ n3 b v$ {
unsigned int b;5 f/ l( G7 E8 u" |9 A+ u- z% W
unsigned int packet_cout;
6 A2 i# X3 T1 u+ a9 r& g4 e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 Q+ ^* k% D7 f- I1 K, }5 @) K! j2 q& @2 V, s$ r
void read_MSG_buffer(int *baseaddr);2 S! B0 ]1 a0 g" u% @
unsigned int count_copy = 0;
0 x7 {1 K( V9 z6 p! W
1 k: ~" n8 N$ o+ ^! F9 ~$ w: Iint main()
$ l/ D- B9 N* A( c) n( n8 V{
! H9 }9 v9 |( N int fd;
* d6 y J: b6 x int *mem = NULL;; \& ?# G- h# v
0 B' G- {/ f7 E8 p* d4 }5 l6 E if((fd = open("/dev/mem", O_RDWR)) <0)1 ~3 N6 U! E0 q& V
{
0 z& z' l" u# j perror("open error");
8 \$ p/ s6 e) I return -1;" h) b' B# X& _; F8 s# [' H5 x1 R
}8 Y; c) ]. G' q$ G
7 I q+ h) p% w& W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 _' k, I% U" t7 i4 K4 g
. G T" m X7 S% b1 W while(1)
1 E _8 j1 f' P* [# s" t {. q; [3 @2 G; O% |& b+ z T
read_MSG_buffer(mem);
! u0 b" E+ {$ v6 N( Z& X } 8 H2 d I$ P+ ?# k- m& \& y' D' T
}
N& p7 m% s b- n7 E
2 m- X- x1 [# ^1 o3 pvoid read_MSG_buffer(int *baseaddr)
2 G, J |7 x" i{4 P0 c% o2 U4 V8 u
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ ^/ U* r! o6 { M) ]9 b3 Z, E
, f; ]' H' ^; Y8 O4 c pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 I/ X# O2 h1 R& w
. v; m+ x2 F& N: n if(pshreRAM->packet_cout != count_copy)/ i" H7 @ G9 q. R8 h6 s
{
9 F/ {; Z9 E+ c4 F6 U$ n1 ?" Q5 e' O printf("a is %d\n", pshreRAM->a);* B$ Y; x6 F9 T/ V. ^) o
printf("b is %d\n", pshreRAM->b);
+ T1 @/ M& q. e% b2 R' o! M3 K printf("count is %d\n", pshreRAM->packet_cout);7 P3 R& ?0 K1 \: U3 G
count_copy = pshreRAM->packet_cout;
9 {$ \ s# }7 n+ Y- V }
7 c& N0 i$ I4 _5 I$ J+ H5 ?" y else5 J1 Z; e, E6 B1 g/ ~; k
{& B( G6 s; c* b6 K. m$ a
printf("No effective message!\n");$ [. I. C% Y2 s% m* a2 h4 K
}
) n" J" J9 n4 N7 i}9 A* z P. O% S. B
6 a% \5 `+ A7 z: w3 l9 q$ M; i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 H' ]+ O2 w* {
) A3 o: P8 N& O
' F& F7 ^0 l* w% y
# K j2 ^: t- \, T8 b
1 }, A5 j. J& Q* a |
|