嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 K* c7 _# r2 Z- N! T2 b: `
$ j: C! x L8 P8 C* U& Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 R2 A$ D6 T( n
#include <unistd.h>
$ y4 @) w. F5 L- b7 W& Y6 D% d
#include <sys/mman.h>
+ E0 s9 c9 B/ P$ s
#include <sys/types.h>
' G; ?7 k, x, D' k! F c
#include <fcntl.h>
' x" v; f/ J& v0 h6 e
1 G1 p- ]( n/ S0 Y( f) Z+ Q8 _
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 L+ { ?8 V; p& y3 L
: `- F8 {+ s# b9 g2 V9 d
typedef struct
9 ~; X, q! Q& k! Q* ^# R: t
{
5 ~3 J B5 l9 m2 ]: B( y
unsigned int a;
) B* c9 I/ B0 m" \. p& g* K
unsigned int b;
/ u2 \' C8 M! D/ }+ U K0 Y, u
unsigned int packet_cout;
& H+ z6 h* e4 o3 y! i# D
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 h2 H! W" W/ b# u
3 R/ R4 W4 q% o; v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: w; U1 v: E5 [( H( @! e; w% K# Y
unsigned int count_copy = 0;
) x% `7 f- K# x/ X8 j3 Y
" |( Y5 k! |+ b5 r9 N5 \# X$ r* z
6 o" E. @: Q& b2 Q
int main()
3 B, D9 \+ U0 ?1 R
{
9 S" y7 @8 F$ U4 y& A& J8 E- B
pRX_MSG_PROTOCOL pshreRAM = NULL;
! |! C7 J+ G2 S
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ P8 o* Z5 H" j x
! p0 S* I& ? [$ l
while(1)
1 x. Z$ p) F4 Y& i. G' x: J( g
{
" I: T5 O# I( I8 _ h+ W2 S& y
read_MSG_buffer(pshreRAM);
: V2 h6 H" w4 g# ]' a2 d, m
}
5 k7 X; [& y( R
}
& v" j! S6 K/ \2 `9 p U$ ]
( a, I6 y2 T# @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- }( e" b+ `2 N" R0 D0 t" X) O
{
1 p/ d: x) [* c0 F, R
RX_MSG_PROTOCOL buf;
; C; k/ k! t2 |6 N. W
P3 @5 w- [6 c0 d: v! G G
buf.a = pshreRAM->a;
: \; w- q: v9 C: k
buf.b = pshreRAM->b;
$ U+ a; J# a$ g
buf.packet_cout = pshreRAM->packet_cout;
, n+ d" A2 X7 O
* J; z: H/ H5 W+ V+ w
if(buf.packet_cout != count_copy)
! g" U* m: d3 M, f# q( D
{
, I. o# x$ r. i% M* L( p8 t! g9 ?
printf("a is %d\n", buf.a);
a4 ~3 P9 a0 |* N) y8 f9 S: v) P3 e, c
printf("b is %d\n", buf.b);
; U, v J1 _, G: ~' s' j
printf("count is %d\n", buf.packet_cout);
" j7 \1 d* w. E2 ~2 P( h W
count_copy = buf.packet_cout;
' \, d% f, g, R, ?8 {( y
}
7 p; W p% P- Y4 S( k% n& U
else
4 n7 V# C/ |5 e ?
{
& z( U* P5 G3 y, h
printf("No effective message!");
) Y! b, Y: ]. A+ }: i2 s' Z. ~/ {8 ^, \
}
+ I& C4 D: w: c
}
( @- P8 D6 A# n* r
+ O' L* g" [. l
' a; I9 R0 R9 N, s, V; K) ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 v3 s- I5 X+ B
使用下面代码,对内存使用了mmap函数后:
) O* R5 c+ h( _: f$ N* n [
#include <stdio.h>
( w% |& h4 e9 S4 F; Z6 {9 a
#include <unistd.h>
) C" Y' C) b7 n) j1 _8 V+ \2 m
#include <sys/mman.h>
q- |6 o4 z; J2 E9 m
#include <sys/types.h>
4 P* ?, `) @1 k: W6 M
#include <fcntl.h>
, j' g. I" W5 H" I( I5 O
; y2 S( X+ o- V( j6 p" |
#define SHAER_RAM_BASE_ADDR (0x80000000)
# w. u* P. h1 Z6 E+ |
#define SHAER_RAM_SIZE (0x20000)
- u% g, s' b& H* n+ [% D
1 z% j( ]/ |3 b) }8 a% c. }
typedef struct
5 J; A* X7 Y' }8 |4 v( ^
{
( g( `9 d7 c- ?7 J& b
unsigned int a;
3 G! i8 @! t: T# k6 T
unsigned int b;
* Q8 x' U* v8 z( \3 B0 g5 P! Y
unsigned int packet_cout;
- X8 ^) D2 ]% J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' ]* k! Q3 H5 x
9 c, J/ p7 Y. ]5 M* P
void read_MSG_buffer(int *baseaddr);
3 ]/ c2 O8 o0 [( {4 J3 U4 [
unsigned int count_copy = 0;
W& G* O' }* s1 C* N
: n8 s- q+ J! v2 @% E* m
int main()
# U) C+ ?0 J% n1 T B+ I& G
{
) g5 I0 M5 K* ^. A
int fd;
' [ @1 z! z |
int *mem = NULL;
2 [ K- a4 F! C# O1 ~' }5 s |
0 K9 C" {4 V: x5 g
if((fd = open("/dev/mem", O_RDWR)) <0)
& W& y$ w" _. D- h
{
0 E$ r* g0 |% `" h% x( A
perror("open error");
e; _# e+ v$ Y8 n3 J9 t' f
return -1;
( l" x6 b) y0 H5 e( e" S
}
. \; v! I8 G: _
1 v: }! X/ T: u5 S8 w
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. n/ K7 `, {8 T* g, H
; I% Y! ]: C+ X# U" S4 u/ K% V
while(1)
: l8 w( ~4 H6 | u
{
& s$ G& \% Z( N& ]1 J
read_MSG_buffer(mem);
Q$ j& b9 \' l% |: O4 N
}
6 b2 [ M' Z2 J$ E y* Y7 n
}
* f% d( U1 o) ]& m7 [/ [" ~
: L9 t) Y9 A( x+ e7 r
void read_MSG_buffer(int *baseaddr)
# t+ Z9 D$ A& o3 o, \
{
( N& @+ ~8 l& i/ d0 t8 q* i
pRX_MSG_PROTOCOL pshreRAM = NULL;
: e& |% c7 {2 @6 t6 _$ h6 P
* O3 M1 [: d1 y F2 g8 d
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
D4 d/ C* }0 Q, S
6 B+ J& x4 c' w9 [6 R( g
if(pshreRAM->packet_cout != count_copy)
- s. g5 ~) `) u6 ^' X* h4 G
{
( I' S# v8 G; W6 H4 T; f7 a
printf("a is %d\n", pshreRAM->a);
, n- F) Q7 j4 g! z% {) [. Y
printf("b is %d\n", pshreRAM->b);
1 d7 |. W8 ~: p
printf("count is %d\n", pshreRAM->packet_cout);
% M7 E( x8 V& R( b# a" Y3 ^: K8 N2 {
count_copy = pshreRAM->packet_cout;
. H! u, u( B+ } H
}
, Z$ |& h7 K) r7 Q
else
, n6 B0 z1 I( b y, ?; l
{
4 b' j* d+ N) M9 x3 R) J
printf("No effective message!\n");
) l# d0 |- ^& Y9 U% T0 e) t+ }
}
4 B& y1 O2 g: w; y3 T
}
1 l5 c. }& R) l, H& g
" e% o$ I; q7 [# X. o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" R# C; U5 p) |# Z0 Y y
# `) a/ G9 X V; | A$ E$ `# }1 z6 \
9 F J i% p4 d4 q
/ T5 H2 b0 B9 Q, \9 \
! }' }6 r3 E. E- z, q+ r0 S
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4