|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' l8 `& v9 L. k0 K, m
" { N% M& b5 A
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' {3 D3 C1 ]4 I6 t! m
#include <unistd.h>0 X: I; ^# {" u+ @6 A3 C0 P; Z
#include <sys/mman.h>
* c4 f8 h, ~$ f8 u: ~#include <sys/types.h>
# U# o1 p0 N% w7 ?8 f#include <fcntl.h>
- C: V2 V- A. O* X8 U" v5 D, z# |- B/ z5 U+ C4 R
#define SHAER_RAM_BASE_ADDR (0x80000000) 4 e) u8 t2 m7 d* H1 r9 C
, t$ U4 U- r! I& R( n( gtypedef struct1 c- Z E5 x: B; S) G. ^8 i
{/ p/ Q X5 V- x* i
unsigned int a;
+ f5 o9 C8 c8 b2 i5 O0 ? y3 `; @ unsigned int b;2 W. u2 z1 O# e' P' m! _
unsigned int packet_cout;
1 \- D0 d. u- N; G}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* h. p. v3 j3 B b! m8 X |) s# i. t$ F7 N5 j" q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 _6 i! Y \! e% V
unsigned int count_copy = 0;( S* z2 T/ f2 s; t% @ H
% G) j0 H2 l5 L$ C) g* l: c
' f) W5 b: ~4 fint main()6 _* p/ r( C, ]& ~% ` c
{8 r( k/ h5 G# c( @( G# K3 a# @5 K
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 b1 \: G Z$ x$ x2 t pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; C5 H: {0 {" g$ h
% a* e1 `' A8 t7 C& ?! ~ while(1)
% E. k$ [4 L+ G* w; R: V$ N {
$ ?1 W& `' Z! M7 S' j* } read_MSG_buffer(pshreRAM);
0 b/ Y6 d* D8 c/ e: G, w. l4 f } + [5 H" G6 z/ m5 _
}
0 S( X8 r/ @$ F6 A/ }
6 q7 D8 X3 K" ]* S# q7 y. i7 ]( pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& w; v/ ^" {6 ?5 z6 w
{
. [7 n2 V: H4 Q2 i, ^9 _ Q RX_MSG_PROTOCOL buf;
' `# f6 d- G; [ g' Z5 K: B
3 l4 p$ A5 \2 T1 H. c buf.a = pshreRAM->a;
( n! Z, B( p4 c6 L: k& z; R buf.b = pshreRAM->b;
- t9 L+ Y6 j& e( k' n9 t buf.packet_cout = pshreRAM->packet_cout;
6 Y1 J* T7 A( P, g1 F* r * p5 B) l8 X6 {) h1 R# Q
if(buf.packet_cout != count_copy)* n0 ]$ u2 o& @) f- C. T. l& |, }
{6 }& M+ H1 j& E0 W. R, N# [
printf("a is %d\n", buf.a);" {" m5 a" s1 b K7 V& ]4 f
printf("b is %d\n", buf.b);) T: h S4 z+ M' q9 r/ B3 h
printf("count is %d\n", buf.packet_cout);
& U% h8 V4 A4 K8 r count_copy = buf.packet_cout;
( k, o& W+ j/ ~1 J4 i9 B }7 z( _7 R* N0 s" Q$ g) ~2 Y
else1 l. M4 T c/ g9 \
{+ v" j0 S, H* l1 a
printf("No effective message!"); F" l7 l" G' I' c6 s, q5 e+ U- T
}
, M( [+ @4 E8 I; p- N3 ~) r8 O}+ ^7 d# R( L, Q, a) `( C# B' ^
* c9 f1 z7 k6 c: [! Z
# O& Y3 K0 |2 K' t但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# O) c- ^( }1 |0 i! F
使用下面代码,对内存使用了mmap函数后:
+ l6 V; K8 F1 u4 q9 P( M#include <stdio.h>
2 m- \3 H7 C/ W/ g3 Q#include <unistd.h>" Z$ ^& H- K* r5 Y! O
#include <sys/mman.h>8 a) J, u. f7 C
#include <sys/types.h>/ ]# f2 g |/ D+ F; M. e; g
#include <fcntl.h> o. B' S! }/ ]9 E
0 \4 @ O# q5 ?* A- N#define SHAER_RAM_BASE_ADDR (0x80000000): L$ Z& R$ Z: y8 Y
#define SHAER_RAM_SIZE (0x20000) . F3 K; m% m8 v; h R) p+ e9 V
" @) l' K; }" ?6 v$ U+ D% r3 Ctypedef struct
5 k/ K. Z0 n; [" k0 d5 @{
- e6 v/ n! k* s0 Y3 h: p unsigned int a;
+ C' M+ }. I5 u+ X8 O unsigned int b;
: z; h1 E) y) X( Z# t unsigned int packet_cout;
7 p! U5 U6 r# M3 U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 H a; P4 E& _, l+ ]
& ~7 L( F. s- q" `! Rvoid read_MSG_buffer(int *baseaddr);' D' S5 G& x' e% U3 G' k7 Y. p% W1 b: \
unsigned int count_copy = 0;8 C$ A- j" S$ W! }# D
$ w; H& _) N8 I6 ]* l# N4 e) ~
int main()
" m& o9 L, y) ^+ }7 U# t{
$ ?6 c( J. |* l5 { int fd;" v* T n% N; Q% z1 ]
int *mem = NULL;
$ L0 [7 ~5 l' K& u" C1 N
+ I* I( t" {) G, a8 i if((fd = open("/dev/mem", O_RDWR)) <0); g: e) z3 v' E# [6 K
{
* v& c+ t3 K& ~! ]% `9 D- a2 N perror("open error");- r9 H2 r8 p0 D" e( W
return -1;* h3 i# b+ \3 d1 O" n% I- E- @
}. |/ I' n. v2 q u% L& q; Z: A# A
; k {. W3 s0 {" g mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ \( u# K; R* X6 R. ?. D; H( j2 \* G& ~
while(1)! X9 t% P4 \% f" |
{$ _' l' l5 r! \5 [
read_MSG_buffer(mem);
, }; `/ t# `! u } & \& |6 r' r7 v! y* u( T6 J
}
' A, N g, J7 y1 I( U1 z, I- r1 O& `) n; _9 J$ h3 I7 ~
void read_MSG_buffer(int *baseaddr)0 g) _3 Z' T1 L, b' G
{6 F' l- Q4 E3 S& ]0 `
pRX_MSG_PROTOCOL pshreRAM = NULL;2 q7 x. U' K F
5 [1 L! K' U) A' c8 I6 o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* W) u2 U" x) y$ M! j0 z$ q
- M& q' c' x* n1 I* N. ?
if(pshreRAM->packet_cout != count_copy)6 _7 d3 |8 { w7 C9 p
{
; _" G2 ^) R- K4 ^& E0 Q9 ] printf("a is %d\n", pshreRAM->a);
8 i, p+ ?* T. O6 G printf("b is %d\n", pshreRAM->b);- k! i5 _) f- M2 G
printf("count is %d\n", pshreRAM->packet_cout);: |9 v# H: \+ K$ [$ }7 J" s( u, F
count_copy = pshreRAM->packet_cout;
' n8 E8 d- \# A! w9 v/ Y. l7 b }
6 F8 Y. K$ D% p1 a3 L3 x: Z else1 L" M1 C7 G; ^, A' i$ j
{1 N% L) J9 D; T# }
printf("No effective message!\n");
% F9 E6 X' f2 k# ]5 z }
5 M1 l* b+ U4 T# I* Y}
3 ?; [! r m. E' e$ b8 ]0 |& t
' y# N4 R2 q, ~8 Z2 M9 e( V没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* o% B& g, M5 n: {
/ n, n9 r) r( O( c7 l
: U H1 i0 B- W# s; e
6 v, b$ }' ?! a% R
) ~* S1 H+ Z; D; o/ H
|
|