嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 f8 t' [ P) l- O; b' R
$ v' Q) D, e2 _6 M( E& R. t( E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
k. j/ j' a/ J( j" T
#include <unistd.h>
( I+ j4 e L2 ?$ ?, M- y
#include <sys/mman.h>
8 z" p% J5 P- T1 w& |
#include <sys/types.h>
! k. H5 a. {" q* C( |9 b
#include <fcntl.h>
( m5 K8 d+ c/ k7 s3 F# T
+ N4 @" U1 Q: Q- h0 m% Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
% ^( W$ F4 o( Y2 Y) X
/ G7 @( n2 R o1 d
typedef struct
4 h. ?2 J, g7 ^) Z& b
{
8 T% `% j+ [2 e5 Z
unsigned int a;
+ M9 `: c/ U7 _
unsigned int b;
4 e: _: `4 T5 w3 Q* {; v* S7 T" e- E
unsigned int packet_cout;
. h5 ]9 }- F5 `( W& T8 _ {1 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ b8 ~/ T) x. G" C. g, @
1 l4 ?* _4 t; A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 V$ z9 {: u% f* \
unsigned int count_copy = 0;
2 w# D6 N# ]. I( R+ a6 t2 c
# R1 H* Q& w1 k; ~. h. O1 F% p
( i- K1 @' W* Q" r3 p3 h8 P2 z. Z
int main()
% z( p2 g6 O6 x- E: V2 o- J$ ]+ b
{
/ N" T6 g: H! _& c; P
pRX_MSG_PROTOCOL pshreRAM = NULL;
) _9 U( y ^6 D; S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ F f+ O) p* i8 v: }( @
/ N* t) T/ E% Q3 W
while(1)
/ e% [4 Y) s. E; t& k/ s; V9 u( ~- m
{
5 J- `' g: X% N
read_MSG_buffer(pshreRAM);
+ S- {* J2 ]6 j' D4 }+ x
}
6 V7 K, Q% F& F3 V/ D
}
) |# M5 d, G" {5 }; G5 C
# [: [1 L. k7 v9 J9 {1 |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. e' }& S- N4 O; ^, m/ v; e
{
/ D) q' y* k( a
RX_MSG_PROTOCOL buf;
1 E# ^2 Q# E8 b) A# Z i- a) |
5 e" T5 N( Y. }- J
buf.a = pshreRAM->a;
0 Z3 l' d2 X8 Z) D% |- X3 k
buf.b = pshreRAM->b;
% r- x+ C9 O' z3 O" H
buf.packet_cout = pshreRAM->packet_cout;
- T$ ^0 x6 W4 X, j# m3 q+ f2 U
5 M8 e$ I/ c0 k2 _
if(buf.packet_cout != count_copy)
% S8 J! ]( F1 E9 h6 r6 L" s
{
4 D2 f! F* R7 E B2 B; \) u( K- W
printf("a is %d\n", buf.a);
1 O0 \3 a+ w! h2 Z7 H% J
printf("b is %d\n", buf.b);
' r" J/ B) ?8 r" T* U3 k3 {
printf("count is %d\n", buf.packet_cout);
% ?# f: t2 K! t3 M
count_copy = buf.packet_cout;
+ t' e6 b3 A% U" V, f
}
7 ]2 V8 ?+ E: H: `5 p
else
# e' _5 v ]: [/ q g: Q
{
* Z( r& g- J2 Q" T4 z; u
printf("No effective message!");
6 l* V* @5 K" W# D. \
}
6 W) m3 ]$ z# J, q
}
~5 p! f4 G( F2 i$ i; E9 l
; c% { c6 b9 h, i! Q
! X7 q0 A9 t+ I$ \ u- Y/ Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! ] \/ x2 r d2 u" _, E) F6 u
使用下面代码,对内存使用了mmap函数后:
. \8 o% u5 T4 D7 `6 r
#include <stdio.h>
; P2 P4 _) n, G. G+ E* [
#include <unistd.h>
+ R2 w& F8 [5 a+ a( I
#include <sys/mman.h>
8 X1 y5 X% R u8 m; t
#include <sys/types.h>
6 a( d3 A; ?4 l# ]" X' u5 z- J* A
#include <fcntl.h>
% C* N' K/ r5 _* B9 B
" ~8 @2 R; V. D$ Y, U( Y
#define SHAER_RAM_BASE_ADDR (0x80000000)
, [4 i7 u2 M6 i
#define SHAER_RAM_SIZE (0x20000)
* ^: L, ~6 O& E
9 G1 J& d+ D6 I+ p$ h
typedef struct
- O q- f: [7 C; C) G, _& e1 c: Z0 \
{
8 }* U: I% }, H: i
unsigned int a;
5 Q: t7 @2 D4 ~# Q7 I6 w1 e
unsigned int b;
: J8 M3 V9 p( B1 T) J
unsigned int packet_cout;
" F# T7 V' W0 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% D1 ]# }( H* P: g
/ E" @7 L/ O4 [; G# c' j* \
void read_MSG_buffer(int *baseaddr);
2 s: a0 d% X! x
unsigned int count_copy = 0;
; z# Z3 z5 Y2 W) a9 A4 W
1 L$ v: P8 O, o) [; t
int main()
5 d2 x0 a6 H: U$ h$ w; c1 d1 v6 R
{
3 p) B! L+ [% ^# X
int fd;
( Q( F( G9 a" C
int *mem = NULL;
Q2 t5 h- V% ^ R. \9 A+ y4 ` z
( n; p* {3 Y- G# D* |0 {
if((fd = open("/dev/mem", O_RDWR)) <0)
) x6 Z; {3 _; g2 M* ]( A) ?: S
{
7 |! `; L# u2 A f; x
perror("open error");
# L2 l$ g; N4 X# P: i9 S
return -1;
* o) q; A0 q2 T* S6 g5 E, H7 p
}
3 B) V& x- `8 j- o( `
) G4 k' E: {* _: W. V
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; a; I8 C: r- u
4 V7 S7 a( o! n+ c% t
while(1)
! L: I( c( d7 W7 m5 w" M! @; T
{
6 ]6 v0 I; h' M
read_MSG_buffer(mem);
6 `' n0 k9 o' ]4 U7 ], w0 |9 g" T, _
}
! G" S$ a: G* f' G, x5 ~: P
}
j$ k, ]/ V7 a4 j+ b
, ?4 s) [; z2 G
void read_MSG_buffer(int *baseaddr)
0 Y5 y5 f% Q, t" }4 ]$ B
{
) R& b% O6 P' ]4 z' q o4 V
pRX_MSG_PROTOCOL pshreRAM = NULL;
}9 @7 l# e$ {
* |1 Z8 S5 U/ M& c9 J
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& G0 E+ V" m- |1 `& _1 }: Z0 [7 t
" O( w. D0 f+ I1 E; W6 E6 i
if(pshreRAM->packet_cout != count_copy)
: t1 ]- Q) P% D. l0 g% c# k+ F: r
{
) } L: T9 I6 U9 X8 e& }; n% `
printf("a is %d\n", pshreRAM->a);
3 A- p" H' \/ c, |
printf("b is %d\n", pshreRAM->b);
* }$ B2 G5 R q' h7 K
printf("count is %d\n", pshreRAM->packet_cout);
+ q: W$ h& p/ E0 F9 r8 \2 \- l
count_copy = pshreRAM->packet_cout;
7 c4 S$ d) @$ ~! q# f% w1 D
}
/ m/ J& o5 i1 c8 v0 @
else
$ `5 d& ?3 _% @5 P! }9 o
{
. I# F& \: j/ G; e$ _+ J9 K
printf("No effective message!\n");
7 `# V6 x, \8 ?' Z$ g1 q/ V
}
( P6 A) P" @& L) c
}
0 [ e5 n* m4 T& W; q" ]$ H# j
5 L9 O; W0 `( A; F( `& G
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' d1 E, i9 U4 B! F4 [9 p1 h* a' o
6 m! l8 o4 y. H( }
5 l( ]/ {* j+ v$ A' M) T
1 v- u$ z8 [; I* c
8 B8 z+ ] p+ Z! S9 N$ u0 K
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4