嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
8 s+ |* i( L* Y" z% t
% @4 G& P' B( l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ p) E2 J$ H( E! Q
#include <unistd.h>
5 u0 |7 J7 V7 t- {1 ~2 |
#include <sys/mman.h>
- A/ g% n/ m- k9 I
#include <sys/types.h>
0 d( A' f5 O0 K2 ^* }
#include <fcntl.h>
& c/ f. P1 [* [) }
. b% _% y8 y- f8 l6 a
#define SHAER_RAM_BASE_ADDR (0x80000000)
! U6 V3 f8 y0 V4 @0 H
# j6 C* M+ q& Q) U' G
typedef struct
! k4 P* ?7 S( L {! r8 i
{
* X7 n. j4 s6 D" X! f) Z
unsigned int a;
/ i5 v) ?, J' T7 z' n7 d/ ~$ g) Z/ D; t
unsigned int b;
, O8 m6 z9 @. h* b/ B$ t- @
unsigned int packet_cout;
; z: w5 g$ J! ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' b! d" N: Y: p9 G# k% T1 Y) k
7 L" U5 |1 k! h1 G/ P: r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
/ {# h( I6 N' ~) ~" U
unsigned int count_copy = 0;
x/ C, v: Z/ {/ v( l5 a' G
* ^* P3 W, m% _% b7 Y
, d% @( C* _- [5 U" @1 ~
int main()
5 U$ `) V3 u8 E- o& {
{
2 Q3 e0 Q; |, m$ {1 j. n
pRX_MSG_PROTOCOL pshreRAM = NULL;
O7 o7 {" _& ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, c5 I4 l1 @- x$ g/ Z% v
8 w, h# K4 B9 `0 I" d5 w
while(1)
: o5 C V& ]2 A5 M) U
{
R' \- ^2 F8 I/ T0 {8 e- Y. U! E1 n
read_MSG_buffer(pshreRAM);
; C3 _8 v" E) i" X
}
0 l( N% n4 K5 M( X" A+ ~* Y- A
}
. I% {3 {) p' d x
" h9 M! Y* h5 Y# {4 \6 s. C8 h0 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( s$ E$ M% a) d/ f
{
* |8 ^7 ^0 t, T
RX_MSG_PROTOCOL buf;
. H% Y" a' _8 _. {
& Y6 M9 D/ f6 q+ Y) t
buf.a = pshreRAM->a;
8 G- f+ g& b O5 ]- L2 h
buf.b = pshreRAM->b;
+ f2 G' P! }8 C7 \/ R* n$ B: R
buf.packet_cout = pshreRAM->packet_cout;
* o0 Q: A7 h/ `. k/ k' o. b
: `1 F1 z) W( o
if(buf.packet_cout != count_copy)
+ w* m5 Z1 z( \/ L
{
' t7 o- r4 j; y0 y& n5 Y* t
printf("a is %d\n", buf.a);
# Y0 `$ P6 ?1 V3 ~* E( W x, f- s& W/ b
printf("b is %d\n", buf.b);
! g7 [7 w* H! ^5 d; v
printf("count is %d\n", buf.packet_cout);
6 m- Y* j; A% @# K! S! p
count_copy = buf.packet_cout;
! Y$ G4 C2 e& }2 i! u- E' R
}
7 h8 B7 ]( O ^- l8 u- {
else
+ }2 k9 A# E# U+ w; n
{
& I$ L$ u( }9 R
printf("No effective message!");
4 I& \& [* ]1 a7 F5 p
}
8 A* w8 g& r5 k, {. i5 w) z
}
0 z8 r1 x6 t7 L9 G7 E
" f* [6 o0 C r) _. G
5 \$ b1 `1 h3 ?
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( y* p, Z" ]2 B5 A6 a3 I! ^( x
使用下面代码,对内存使用了mmap函数后:
0 l/ O1 _( v1 Y+ r% N2 m
#include <stdio.h>
; |/ B" k$ }- B
#include <unistd.h>
6 b, l) D) B3 c
#include <sys/mman.h>
0 z) B/ r# V4 W
#include <sys/types.h>
+ t, T1 H T8 k- I
#include <fcntl.h>
& I8 {3 J. u u0 H+ Y, q
" [+ ~; l4 {$ C$ f: v; \
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 g0 \$ l4 p% l- m/ @
#define SHAER_RAM_SIZE (0x20000)
7 w! \+ S5 b3 a+ ?; f$ |
+ L( \. J; R$ `0 ?* ~
typedef struct
: {! S( X( C7 I2 [2 T/ |, U
{
; e. j, e* R; N, F! k+ s
unsigned int a;
! @7 r1 Q" A7 f: G J( t M& [" @* u- h
unsigned int b;
0 a5 q0 D( ~2 F8 r. X8 H- c
unsigned int packet_cout;
9 ]9 T, [" F$ m' _+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 B2 Z- j0 D2 W3 s1 S! p
l! f/ `- C! v# Y1 H7 g& S- w4 P1 [
void read_MSG_buffer(int *baseaddr);
' `* v: n1 D* g0 `+ G
unsigned int count_copy = 0;
* k! e$ n0 @; s6 _
5 U) J5 a* d9 c! _- a
int main()
+ h4 K2 T9 e. k$ @+ W
{
: `( | g) t0 B) n: a
int fd;
( S7 G& h6 F0 ]+ ~. ?
int *mem = NULL;
" O! o' H( `) V* {) T: V
B0 w( ^) J7 Y& U- ^- E
if((fd = open("/dev/mem", O_RDWR)) <0)
/ |0 V; n5 N8 o1 a
{
x. {$ h, F. E' n2 _$ M& T
perror("open error");
8 a' D# k& ~5 v t( R$ ?2 I, o
return -1;
. e( Y5 G `: _' D8 b: e" @: ]- p+ y7 ~
}
* q( y$ j; X5 Y0 ? ?
; L% _8 t, W+ O- P% Q% H: Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; i$ F# z: G: b; s
5 ~0 U: o" A( F5 e$ x5 D: p. k
while(1)
( x# O7 y" F' K( W' \
{
1 K& g" f4 ~6 R" l5 X E
read_MSG_buffer(mem);
2 R6 y. ?) [. F+ V! \, ~6 Z
}
6 |! t( |9 `) D' r" a+ _) }
}
! d+ [( c+ D8 x: C
1 |, o, P$ S- J e, s
void read_MSG_buffer(int *baseaddr)
) M: O% e8 t! x, P+ q
{
D7 g, G5 z( c, K
pRX_MSG_PROTOCOL pshreRAM = NULL;
* c5 T2 L- s9 k, o5 u6 N
% e! T# R& E: H* } J, ?' g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! g/ _, E |& g
" D8 v( E2 [; t7 v( ~. J$ D
if(pshreRAM->packet_cout != count_copy)
0 M1 ~/ h% a" ~) Y% u- ]! ?# ^" c8 D
{
4 L7 _6 Q+ ^+ u8 h
printf("a is %d\n", pshreRAM->a);
6 B3 x% G* e) e
printf("b is %d\n", pshreRAM->b);
: ^& N" F: p7 I
printf("count is %d\n", pshreRAM->packet_cout);
: F" H7 _, p+ x% {: a/ u8 a0 q
count_copy = pshreRAM->packet_cout;
1 p2 W: J: O6 x2 u8 K: Y7 B
}
4 E! F4 C' c: `* S1 p
else
. Y; u. q' X% f5 Q* q/ o
{
2 [& V9 W% p1 M ~' y
printf("No effective message!\n");
- M* ^4 d4 ~7 f$ H+ S
}
; g0 l! u2 O* v5 W) D# y+ d
}
# b# y/ s0 ^# F' ?# \
9 m2 |! Z1 |$ y& S' w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& V9 `0 I# [/ G5 Z
+ r" P1 P" I& w" O" A* C& ]
- P/ }. X' v& i: i' t2 j, d" ?& m
+ `+ V6 F4 n/ {+ b$ H5 t
8 ^' S/ W' y. e' K
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4