|
|
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 N" r" V6 o2 D
. g# Q8 E5 r# W I2 \
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
' T& b! j: F; x8 P* e#include <unistd.h>
. s5 d6 W. L2 Z% k; X#include <sys/mman.h>
) `" S( a$ @! h X6 ~9 @# v& E#include <sys/types.h># d8 Y+ ?% z8 K, J& D: i
#include <fcntl.h>
3 u% X5 ]- B! H9 a4 u/ U4 e+ s5 k. l" a
#define SHAER_RAM_BASE_ADDR (0x80000000) 1 H% D- u2 P- S. G, H
, k! b4 i5 y1 O
typedef struct) G* o: d6 a# s* }$ t
{% O) N4 V" |& p/ Y% i. y' X
unsigned int a;
4 z8 n3 z" u# D! O7 e) [ unsigned int b;
/ f8 h( z# r1 K: t5 M unsigned int packet_cout;
7 `1 G; a# W T2 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: W# @1 A1 Z+ P& G. D
( X% ?: G# g0 q6 \5 H6 }/ c. D) A: jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 R9 K! v" Z1 m& ~- Y' b$ @4 munsigned int count_copy = 0;3 k8 R u/ b9 s7 D
5 B8 V- E7 t. l2 k, ^
- x& X9 t0 m2 W/ R' n
int main()
: z6 u% q) O& v( @{
' u4 r9 i k' L! [2 w. ]/ | pRX_MSG_PROTOCOL pshreRAM = NULL;! I. c' I' R% ]; I( @1 q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( ]. Q1 ^$ ]- ]5 f1 W
7 @8 }, O( ~* Y- @! A8 H; m6 K while(1)
4 E7 d/ B4 J1 A6 f( x {
- L+ v0 P! X- I2 q$ V% T4 f read_MSG_buffer(pshreRAM);
* w, r" y$ C3 [. c% g, }! n }
1 z( D/ N& `* i# k: |}
# l# o3 I- w$ |0 M7 r8 ?) i0 b: y, k3 u, d* H- V+ D0 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" F. s [. B2 b{
* \1 T6 U4 l; M: Y0 Z RX_MSG_PROTOCOL buf;& S- a1 H( Y! e) g" M5 U3 p7 x/ q: U
" A( M; r3 R# W: ?8 i buf.a = pshreRAM->a;) \. u+ ]% T. J1 d" u
buf.b = pshreRAM->b;
( C* j* M+ F/ j buf.packet_cout = pshreRAM->packet_cout;
" Y- n4 a1 J# p" j h" \$ S' J
8 Q0 E% t; O- |5 B if(buf.packet_cout != count_copy)
# T7 B4 Q) s4 n/ } {
$ D8 ^ `' v. ?4 I0 |( i, d printf("a is %d\n", buf.a);# I7 Y F; h I' N& b! o
printf("b is %d\n", buf.b);3 {5 G; w4 ]& t5 e1 h3 U
printf("count is %d\n", buf.packet_cout);. z& f1 q+ Y2 G; c9 ^
count_copy = buf.packet_cout;- @8 }" R0 ?8 {9 x+ I. n
}
0 P* L+ D; i' G else' a0 U& o% Y6 P( K. I. F9 U1 v
{
1 w/ ?' [+ B/ V# `' x printf("No effective message!");* P1 ]3 }/ J) g4 T5 p
}
" S6 s& [* y& b4 b6 k# @}; }& g: Z; w( U3 l* ]% |
% Q0 B4 J2 z* o1 P! z8 c
! N$ e9 c* C; V0 B" D* J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
c. s( `2 T( ]7 P5 B q& c使用下面代码,对内存使用了mmap函数后:
' ?/ _. p0 U$ S# V, V5 R#include <stdio.h>
( I! K! X: W1 i6 g% ]# s( G% e#include <unistd.h>
' x8 K. U8 @2 E# [9 A2 c f7 [#include <sys/mman.h>! z* e& c4 t' J! q6 b6 y2 l6 U
#include <sys/types.h>
6 ] c: I. C4 Y6 c#include <fcntl.h> i- {$ D+ N# n# i: {
* \$ V9 W" h0 g
#define SHAER_RAM_BASE_ADDR (0x80000000)
: i3 q u6 X' J' t5 ^#define SHAER_RAM_SIZE (0x20000) & `6 L/ |* ^& `9 e
6 i" Q5 h" K( m* ]2 H
typedef struct
0 f- |9 u: K3 X3 r8 E{
! P* T# {6 T7 W+ I unsigned int a;
! f& y. N* g8 n( P8 d unsigned int b;
, a1 k. ~2 i% e7 a unsigned int packet_cout;) Q( u$ c3 c! ?2 X+ A1 K! A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 l& g. m/ [; x1 x$ D
1 I: A; R8 p5 D3 ?: x4 J
void read_MSG_buffer(int *baseaddr);
) v( J) a" P" x; ~% q& Xunsigned int count_copy = 0;
1 Y8 ~1 N. j+ Y' H2 S; j) b
& f% p0 S# _2 C/ rint main()
2 {& Z! w5 `# Q4 c( c$ a. i{7 P2 t2 R; m! C# ^6 u' _, H1 e
int fd;2 a4 q A6 L4 N& l# |
int *mem = NULL;$ R% }! y% p& g+ a
# Z6 ]. [1 c4 H- J
if((fd = open("/dev/mem", O_RDWR)) <0)
( M5 e1 F' @* T( G {, N# S2 M' F, V' f
perror("open error");
2 E. {- W0 C' h5 P return -1;
- a+ X* R9 j9 K+ e8 m }
' F& B. r D# h; l5 u
' J% ], ]) T# E4 `6 }. G" M* ` mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 N/ Z- b+ M+ m+ {: t4 _3 W" a K: i- t4 Z+ E7 {( ?
while(1)
# [- l. j* i! }; N {
* ]4 h7 U. x, I7 f9 ^ read_MSG_buffer(mem);4 B0 t" T" h" n/ {) m8 F% a
} 4 v' W5 O4 m% @% j. `6 i& Z
}$ `( c& D' o3 w3 S9 r( p1 S/ }
5 E. V+ ?" @% u3 z0 z+ x: B
void read_MSG_buffer(int *baseaddr)
$ a2 _2 t! }$ y8 W' y- ?- Y{
& m+ B t2 K; d0 A" T pRX_MSG_PROTOCOL pshreRAM = NULL;, K/ T" j; b2 g
$ R" F. d: _( j: A! p! l pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 A& T8 I$ L; B* {
. H/ D) N" a) h) t4 U if(pshreRAM->packet_cout != count_copy); n: ~9 ~* v, c$ g
{. n' O6 ? }. U7 I
printf("a is %d\n", pshreRAM->a);
L+ U4 p. m5 Q( T7 a( } printf("b is %d\n", pshreRAM->b);8 ^' ?7 c' e* e. g+ A+ ^7 X
printf("count is %d\n", pshreRAM->packet_cout);/ W8 t$ o& w- N2 U' k$ m) r
count_copy = pshreRAM->packet_cout; x. h: N i( h/ g1 A% Z% w3 }
}
- P: ~7 O# I( ^3 q, y, o8 i) p else# M* u( q* K/ |' c" w
{! N9 ]" }1 B2 E
printf("No effective message!\n");* n0 a! q& V# h X0 R; p: _
}
N, B# x7 R7 f) F! k# V}3 Y5 t7 I$ h, `7 f- ?5 X% t
* h4 Z+ {: E9 d" r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* Z% `; k9 J2 u7 F7 e' ]- w
5 x5 D* L6 F/ {5 {7 M* V) G8 ?2 R& s1 V q
+ Y8 ]$ l. ~# L+ p/ h
- ^9 @! B" G O |
|