|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / p9 H8 M: g1 ~& V6 Z
9 T* N+ A$ p" P$ x; R1 y) c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( ~# B* K! r: `# j
#include <unistd.h>3 C" y5 l8 H3 {2 ^3 k4 l
#include <sys/mman.h>6 B) r- m8 N# z( d- |8 c% i' ?; y
#include <sys/types.h>
: ?5 P5 J- Q& N0 K* j#include <fcntl.h>
$ ^/ R8 O* H9 `% J: m8 G+ s2 Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 Q4 ^* b6 d( K8 q$ T: ~ T5 _
4 J' b" `* a2 Y6 ?typedef struct
2 J8 S2 L! i* E3 c8 c! {; T5 l6 }{
8 q2 r1 r& T9 c3 v# V4 z unsigned int a;
+ ?8 C/ @5 C3 `7 e( G/ N unsigned int b;
/ T: F2 [: b/ ? unsigned int packet_cout;7 t% }, ?: ~( x; M1 X) E' r+ K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! a/ }* [3 F8 j- X. M" K* W' `' }8 s
! j% H5 r% T* {3 F3 |5 O$ P! W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- L+ P( } ~+ vunsigned int count_copy = 0;
( W( Y2 M; s; P) X. V2 S2 S6 H: v. E5 J! }
, X" i* ]6 ^# Q9 ^( wint main()- N2 e9 L; c0 f# S4 Z/ {
{
+ d% Q$ {& y: m/ o pRX_MSG_PROTOCOL pshreRAM = NULL;3 \, Z8 W8 ]2 U! `2 S; F* p6 S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 j- }, J( b" |, I2 `0 P$ T! q/ ?+ }& l/ T
while(1)
2 @% Q: [( H% l! K3 d& |* b& e {! H d0 F$ x* F- \2 O# \/ C
read_MSG_buffer(pshreRAM);+ F, C2 D" T( D/ a
}
( ^0 J# n# C7 o) w}/ |5 ~# M# v. u- a" {8 u1 ~
7 [! w- V' O' }0 A: m" `" ~% ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! B1 l6 Y/ v2 L4 J
{
1 a/ [. h0 S# o" A( {7 X RX_MSG_PROTOCOL buf;; X; b$ u8 l A. X5 h3 L
9 W" o2 C3 L# V* M2 i! r. W: O& d buf.a = pshreRAM->a;( L0 U( W( E' u6 r/ U5 |
buf.b = pshreRAM->b;7 T' F& Y( G$ B) {2 ]
buf.packet_cout = pshreRAM->packet_cout;
) o- X. j$ `9 r
0 S: X4 ?' a! F& I if(buf.packet_cout != count_copy)7 t9 M, a" G3 f8 I
{6 i. b5 a1 M, N
printf("a is %d\n", buf.a);
/ [5 m$ B- _3 O( } printf("b is %d\n", buf.b);
+ C' S$ K* R: C" O8 V printf("count is %d\n", buf.packet_cout);
/ s9 N7 g5 P# h/ M count_copy = buf.packet_cout;2 {, F9 @7 I+ g" W; j, |
}- L7 \% `% q3 Q8 t& k
else9 u$ y* M2 I2 a% g4 Q
{% j* _( L2 a z) T* @
printf("No effective message!");# D2 j% T* {1 \$ E
}4 U. d l* B' e6 J$ a g+ l% B" |4 _
}) m @ ~6 @3 m7 F
/ G) j( V- P, K3 f+ Q4 \, ~# g
4 @( M( X) v& s: h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( |' n+ m, z8 L2 A使用下面代码,对内存使用了mmap函数后:" M0 a3 O! }; z. P6 x. o
#include <stdio.h>
5 L1 d( l8 l& F4 ^#include <unistd.h>4 V8 P# K$ [5 w# @, i
#include <sys/mman.h>0 n% N+ r% C& B u. v l
#include <sys/types.h>
}; X: A( P$ c. ~% d( k. F3 a#include <fcntl.h>* \& O- ]; t5 B T# k5 G
1 i b4 t0 H' ^+ v' j- v+ \#define SHAER_RAM_BASE_ADDR (0x80000000)$ ^ r) T. o. p) v2 U
#define SHAER_RAM_SIZE (0x20000) # F/ K( M( N) C3 `: C% b
$ S# }' I4 h, Vtypedef struct
, s2 [$ r' b$ H$ e+ R- ~{
- V# ^/ M3 b6 e) W4 s unsigned int a;
( D1 G" ~- H* W unsigned int b;
! P7 f# t' H# D f& d" ~ unsigned int packet_cout;
3 b* j& w' Z" R0 C! K, n6 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ ^* q* g/ _# y E* W$ V
2 H/ C0 G. C* R( C5 y" Lvoid read_MSG_buffer(int *baseaddr);
; q, X1 B0 i0 B" A& aunsigned int count_copy = 0;
2 z/ T# K0 f U7 u' l
, J& K+ O/ n2 C0 ~# ?int main()
& w. {8 C5 g1 n- q8 d{
; ~9 f! o' @0 `5 X9 H( B5 J int fd;
+ n0 _$ L3 b5 r) E4 N int *mem = NULL;
# p8 o2 r ?1 q, `: G+ Y4 |; V1 s3 Q( g) u0 N8 d, f# Z
if((fd = open("/dev/mem", O_RDWR)) <0)
4 U( h) t. i. m( h4 W {
{4 V- D2 Y; p/ a9 h perror("open error");% H, q- g5 Z0 e- N" |
return -1;
: G# a- M: S; U4 G0 o: v }$ Z/ I( ]5 |" ~% x7 ?
+ I0 Y1 b) r0 A! d, [ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, u1 J" W6 a& u5 R
8 g# N7 o2 b6 v. r1 _1 v while(1)
% V/ t* @- p" s; j3 ]. g9 s {' G3 x7 b, D5 R! n, t+ u
read_MSG_buffer(mem);' V, E4 ]8 B' q: T
}
$ k8 u+ e( y2 B}
9 K( Y& m& V8 S5 K
: O- y" c$ O: c4 \- }4 mvoid read_MSG_buffer(int *baseaddr)
3 W9 D' a/ _9 g" Q3 O8 A- S{ X: ~5 c8 ?- w9 {
pRX_MSG_PROTOCOL pshreRAM = NULL;. q: j- K6 x3 @3 F
/ T+ v& m+ K9 _% p0 G) U+ X pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ w8 x' P( X N/ n* A6 Y h B
% G* P1 [8 \/ U/ u if(pshreRAM->packet_cout != count_copy)
1 ~. l0 z% v I! z {
) k0 ^0 L/ t3 y- ^9 l printf("a is %d\n", pshreRAM->a);3 m! R: [ e. g! U& w9 T: w- J- T4 t
printf("b is %d\n", pshreRAM->b);+ l* I* R8 e0 t( Y
printf("count is %d\n", pshreRAM->packet_cout);
9 L0 y- K& b: w# t) @: L3 B count_copy = pshreRAM->packet_cout;" U; E! y! d9 F D% Y
}
2 v8 t h( i8 K else
6 E0 v1 w9 {9 H/ B7 {0 Z& ]8 n2 Y {/ ?, Y$ k# ]. H/ P! s' h
printf("No effective message!\n");4 l) ^: F3 Z* N% c# p' i% v/ a
}$ Q, J: c) G4 p' L" }# g
}
: v2 c; i( f" A& b# T& f, b1 T, T+ D" D3 E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- C% Z* v! l# ^5 c9 A9 ?$ k1 @9 H/ Z+ D+ c
8 w8 h7 |) W. M. ]4 [& Z+ V$ N ^
- n8 w- ~3 p! V( q; G- K L
|
|