|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' P) h- P9 r7 V" G: b" \8 w6 _& E/ K1 K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. U2 e5 S0 y* ~8 P8 A W# c, d#include <unistd.h>
. n# K- r8 [9 l1 h' J$ @1 c8 Z% S#include <sys/mman.h>
; T) q2 R# E( `% J1 I#include <sys/types.h>
+ C' u6 ]* U/ @* w9 V#include <fcntl.h>
% y2 q5 l: ]6 }
9 H# Z* q: `" o; Y0 r) I) N#define SHAER_RAM_BASE_ADDR (0x80000000) " O ]: A0 ?6 x8 [) f! t4 v |4 o9 e0 B
3 z% R+ \" d( Rtypedef struct
; m% k* h2 ]. T* p' |; `0 V{
/ w! z5 t( B8 D' p3 e9 _8 V5 k unsigned int a;
! y, |; ~' B8 I, K' k% w, }! Z) y unsigned int b;
/ L: p/ x" K, Q" K7 {2 t" p unsigned int packet_cout;, y* R+ Y* @$ q5 `; [; k: a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* L' T* a' w/ C2 l8 d2 z- W# }* X. a9 t! _' i5 a4 S. Z4 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 }1 [& k$ h2 B! o' `& P" L3 S! Q- h" x
unsigned int count_copy = 0;
( l* |* W' h) G$ G) j6 H, X6 t/ e. y- V& Z" k7 w- n
6 ? N8 G- Y1 Y4 @+ d
int main()1 x) [7 ^7 Z6 w# t/ {
{- W$ W( T' [$ F, K& _- x i/ g
pRX_MSG_PROTOCOL pshreRAM = NULL;8 f$ \8 ^( O. s. Q9 e1 U; d' U5 F
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- n) A1 Y# j' f; V5 f
5 B: D0 \9 y' g5 ^6 v! ^7 z while(1)7 U. V3 N& \3 k/ ^ l. T
{) R7 g0 \* y" o6 K; T
read_MSG_buffer(pshreRAM);
( l" d% z5 L( A0 ~% J1 O5 I }
+ P9 i6 Q& C/ r" e} k* E5 N1 [, z
7 R8 t! N6 y6 q$ ]1 v- M( Z+ ~void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" b1 n# N* `, y! q% Y+ I* L{* i( B9 Z% T4 _! f
RX_MSG_PROTOCOL buf;
0 [( K. @( D3 I& L * j3 g K/ r# k
buf.a = pshreRAM->a;1 t% T L/ |. {0 y) v
buf.b = pshreRAM->b;5 [1 G# `* E* P& \+ m& R
buf.packet_cout = pshreRAM->packet_cout;
$ k. u; ^- H8 U4 [
: M+ U0 j9 S \0 q8 w& X3 m: S' a3 { if(buf.packet_cout != count_copy)/ T8 Q/ p- x7 `8 Q- p
{+ [/ a* B- P9 z( }
printf("a is %d\n", buf.a);6 i7 g' ?* s& S& k4 |. h8 ~+ C
printf("b is %d\n", buf.b);
; a k7 f1 ~) U; I$ N- ? printf("count is %d\n", buf.packet_cout);
9 @. |0 ^3 y0 L$ s" j1 B: { count_copy = buf.packet_cout;* @6 s2 |5 C3 F A2 c/ J6 t G, g
}& M9 I/ q, ]3 a/ h
else
. e- a8 |5 p3 `) _# J {
! R- D8 j" _$ z printf("No effective message!");# h2 y9 @& X- I8 }0 c5 v
}2 ~- L/ V/ j2 ?# }
}- f2 X; D, c$ r. s3 ?
, O- B3 \9 A& _/ @& V- X8 M$ q! d* {# }
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: m4 s8 I; \' W; M: M! |; S
使用下面代码,对内存使用了mmap函数后: { \. Q2 X: }% l" Q( A8 {
#include <stdio.h>" h. v1 e5 S, ^# S
#include <unistd.h>
! A1 W0 o4 N! j4 w- h2 c. ?#include <sys/mman.h>) ]0 j' Z1 i2 b, e
#include <sys/types.h>
8 h+ r- Q$ \% O) U#include <fcntl.h>, g& ~ R( S H
' } E/ ^' S8 K* _#define SHAER_RAM_BASE_ADDR (0x80000000); e# \ P1 ^# j" o9 p
#define SHAER_RAM_SIZE (0x20000)
" r" @' i, ~/ m& O. E- J I W6 Y$ t/ q* X: o
typedef struct
) ~+ ^+ j1 B# w" K5 X{; ?) k' @: s% F) ]8 a
unsigned int a;
0 p; k2 h" n7 B3 P% W unsigned int b;5 _2 M4 G2 M' Q% W
unsigned int packet_cout;
. _4 P/ h q0 O5 u( [, |}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 V* Q+ h! F4 r- c9 g; ^! y6 S$ J# I
% |- }5 b: k. H+ E9 x) H; Y: Zvoid read_MSG_buffer(int *baseaddr);
) b! _1 I4 j% x' Y, ?unsigned int count_copy = 0;
# B5 e ]' k" t1 L- _3 A
; T6 ~7 ]/ n2 F/ N2 C7 k1 N0 J1 Rint main()
9 @9 |0 v+ A( z& G- x% ]; b2 r{
3 n1 y4 j Y, L- o int fd;/ w) w, g1 x8 E7 x* S
int *mem = NULL;
/ U9 X* i0 P/ }* ]/ \
7 \# Y' [& @& k* y* n" {& ] if((fd = open("/dev/mem", O_RDWR)) <0)
. b; v5 ]" b& N; S1 ]! t5 s m6 R& S {: O) G7 U2 k( m
perror("open error");! c$ x8 E: a. `) Z/ ?8 d5 b
return -1;2 A3 S8 j9 A1 E
}
( b( y0 k( v Y4 p9 v
' J9 T. n7 h( ]& S `4 o7 N' m4 @ mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, s5 w' M: }. w4 K
, W9 j$ W! n0 ?7 i- c+ N while(1)
. B, s8 E {( q- q) s0 h {
" e7 S# Q: o: b5 K" K( A1 t+ a9 V read_MSG_buffer(mem);) ]% ~% ?% t( Q4 h0 C8 J" H
}
. i; y% {3 a# p ]+ z2 x}" x" f5 w2 H1 P. R4 T$ v1 |
" m* F: g3 n+ l3 Q6 L
void read_MSG_buffer(int *baseaddr)
8 E- S4 u: M' e" f1 A) o3 y- [{+ d1 q* }' W0 q5 a1 M( _
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 m: k0 [, Q }! z8 x4 X
6 ]& o' {- ^5 r3 v, o5 u pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k: l6 I' q: r# r
; K8 L* D; m7 a# A if(pshreRAM->packet_cout != count_copy)* I2 @+ J' O5 O/ o) s9 z
{
4 S: B' w6 u% u1 Z7 S1 D" O printf("a is %d\n", pshreRAM->a);
; L& j3 w2 j" x printf("b is %d\n", pshreRAM->b);
0 F$ N4 `# v. y/ } printf("count is %d\n", pshreRAM->packet_cout);8 s" I# |! N& [$ n/ u& h
count_copy = pshreRAM->packet_cout;% U8 V) `7 r$ z: t$ D8 u3 w8 ^
}
7 [. c7 E) D4 A- j else3 d5 T t. _2 M, {
{4 ~0 G7 D! L/ U4 B/ u- M9 c1 e2 h" }0 @
printf("No effective message!\n");9 e6 i, X! Z" I2 a
}
4 R$ C/ `. o0 Y$ D4 R' r" y- L}
+ l' d3 b l* C- b# m. L+ m6 p, E3 b8 p5 L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 U4 }& k y! S8 n! S+ t5 y
5 D# X$ L# D- d. f, I
( A# A5 q U b" }- ?, L5 l* k
( V L' Y) n) q* `% d$ X
/ |$ L( \) J+ b |
|