嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 ~' s$ Z6 D$ q: D* Q5 s
! Z+ b: } F% N3 e4 s: k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& ^+ j, D5 C! _5 w- V, Q
#include <unistd.h>
4 c. f6 [$ p% _2 C/ q( T: B
#include <sys/mman.h>
$ o4 U% J2 F+ @, w+ ~
#include <sys/types.h>
3 @( n9 ~; o6 \% u4 g0 ?5 ]
#include <fcntl.h>
- w! h$ S4 I) J1 Z! K+ t2 T
k9 E5 B* O5 L! u
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 ~. ?* v- k2 o/ ]
' d8 r( M' I% q; l0 j
typedef struct
- l8 B) c8 U) f
{
( d g: H( H0 n; P1 B5 g
unsigned int a;
7 n d" D) _6 z u
unsigned int b;
. y0 {6 {; w. R# k7 M0 X& j
unsigned int packet_cout;
/ g3 Z+ k g$ K9 j7 p! A/ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 K/ q$ N+ x( E4 Y. Q6 s c
5 w3 d% T0 f: k; j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" g" ?& X% N6 k! I
unsigned int count_copy = 0;
6 m6 ^, z! B5 s
/ I3 t- L0 j2 _" d! s
5 v C! T s* g) h" e5 M
int main()
& R1 L3 v. `2 Q) I* j) M/ i0 K5 t9 B
{
" l, w1 {5 @6 Y/ o' `0 H v
pRX_MSG_PROTOCOL pshreRAM = NULL;
, a+ E0 d' E# ]# Y" ^ w4 U2 ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* ~3 A+ H8 X* l0 r8 d' {" s9 F
% i: M# |5 r+ g# {) ~+ D- ^6 K
while(1)
2 w; |1 M. d$ j: L
{
$ ]5 S- y9 R# I. a$ D
read_MSG_buffer(pshreRAM);
5 ?3 {. g/ B9 `1 o
}
# h+ e5 U6 Z+ g2 z( t0 P
}
; g* _8 p, ?2 k! ?
2 X1 k ?8 u( q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! V3 b2 n. v/ l4 a2 [1 P
{
, w% z/ ^& C7 l7 j) k9 X0 t
RX_MSG_PROTOCOL buf;
' P* X' [+ ?" d6 r# C: {% K
: Q7 Y) t |6 l. R7 D- e
buf.a = pshreRAM->a;
6 i( m* |7 M' G4 X5 [. z+ g
buf.b = pshreRAM->b;
# T( B4 r9 N- H2 X
buf.packet_cout = pshreRAM->packet_cout;
4 W" j" N1 q* o- t1 c
?* R! I8 e, \9 n2 {2 ?" `
if(buf.packet_cout != count_copy)
! i* W5 V; u5 D5 C% u+ |
{
4 s- B. @- i0 s |+ Z$ J
printf("a is %d\n", buf.a);
/ `6 e# ~7 c( }
printf("b is %d\n", buf.b);
A* q+ X0 _& p; @
printf("count is %d\n", buf.packet_cout);
i- @+ w$ k g/ m
count_copy = buf.packet_cout;
; c N- N8 @( s
}
5 H; P0 a1 w2 @# x
else
4 P2 `) \% p) e h& N
{
# [, }1 P) c/ ?# K5 i
printf("No effective message!");
9 U" Y& y1 |1 [
}
7 n9 ^3 w; z* h0 T" l% t
}
0 t1 i) X' Y. ~2 w0 f+ O% B
) i2 {. c8 y+ M
0 j4 L( X7 {9 v. T3 W
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 V0 j. H' J# Z* R( h/ S+ G% K$ }! |
使用下面代码,对内存使用了mmap函数后:
- D& e1 R8 a4 g3 H, k. `2 f' i
#include <stdio.h>
) [( F! x0 u& l. y' f
#include <unistd.h>
@+ Z- ^* p+ a! n
#include <sys/mman.h>
" g" W/ }# ^. P, b* J6 ~
#include <sys/types.h>
9 U3 M: o) J. L0 A$ o
#include <fcntl.h>
1 K. A8 X, w, ~; f, \% |
' k" l6 v6 P- W y- B# N8 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 w* C& m& |7 x) R
#define SHAER_RAM_SIZE (0x20000)
5 O4 y( w' Z- z3 ]; ]: u& b: m5 G
* P+ F: l6 j) c
typedef struct
. [: ~5 f9 h3 x( k E* C; N0 t( n
{
$ {% t. ~4 l2 l$ e H
unsigned int a;
0 z. O0 v9 @ ~% ^0 a% [" B, y
unsigned int b;
+ q% u: q7 ?- s4 c* c
unsigned int packet_cout;
4 u. e* ~: O6 K6 f7 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. w" t: b: E$ J" J0 A' O2 A; t8 D
0 V5 D$ w5 a8 ~: K9 N7 q
void read_MSG_buffer(int *baseaddr);
' a; y; @) T6 ~! U9 _& Z# v/ @. K
unsigned int count_copy = 0;
- k0 P( O& K, s7 X
0 P% ^* U7 m: M/ L3 s
int main()
, Y6 i0 I* j) W/ @2 F. ?$ p* k* T
{
, b& t: K0 m; G3 ~
int fd;
8 L# o# N' j A9 d
int *mem = NULL;
; t: k' \! G( h
& C1 p$ H7 K6 X9 v, _
if((fd = open("/dev/mem", O_RDWR)) <0)
3 x8 I' ?" z0 K0 E. o% S3 J7 W }
{
) L) i; j) \( Q/ L4 i
perror("open error");
0 }) x6 K3 \3 {8 \' j6 C- }
return -1;
+ t+ L! { B) ?5 [
}
/ @% s' o9 ^7 ^, A; ~0 O6 J, k% w8 A
- J+ s* a* P% p0 w$ L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% p2 t- Z* x! I4 n C
' ?; Y8 a N8 p; }# Q+ s7 n% Z$ `
while(1)
% J2 ^8 W6 D: h8 k& U5 s
{
2 _ |; [* T8 A- A9 o2 D
read_MSG_buffer(mem);
5 V' h! d4 w( m' j. f$ K
}
" ?" j8 f* a: C& y- Z7 M
}
5 }9 ]& Y L$ i9 P/ k
! d$ P, Y) ^, {- i
void read_MSG_buffer(int *baseaddr)
& I+ k5 r. \2 Z+ ^6 {3 ^
{
4 U" }& X" d& C5 Q3 i
pRX_MSG_PROTOCOL pshreRAM = NULL;
: g+ z, e5 F# F z- y$ }
+ z: q0 Q) l' Q6 v* K A2 O2 I3 @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# ?( `* ^+ r) \ l7 r# h" j# g
& v7 R3 Y* N3 j3 a
if(pshreRAM->packet_cout != count_copy)
+ x& c q3 X, X4 u; X
{
- R0 `+ A9 w& `4 x, {$ b5 r! D$ T1 t
printf("a is %d\n", pshreRAM->a);
, p3 _# g: W- n$ W: N6 y, P
printf("b is %d\n", pshreRAM->b);
+ N: C6 a m: H i! {
printf("count is %d\n", pshreRAM->packet_cout);
' U* Y+ E+ C# w1 A
count_copy = pshreRAM->packet_cout;
u8 Q* P/ @: [" N4 M
}
+ d' G4 r( ~5 g% ]
else
. X2 j: Z3 S; r+ V; q8 x
{
5 Q! M: a( r I$ E
printf("No effective message!\n");
: i, `$ Y/ F; `: W% Y$ q
}
3 w# g/ D+ N$ f, s
}
7 p! R, k/ r; c' B# H- R# ]
0 J* _- R% f' A3 y" i1 a) j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- Z; W* A$ J+ ^3 k {- v2 P
: }7 c/ ~$ N# U, E' A! E
2 f r4 y: n& @9 m
. }" [6 _* R, x- F3 u
1 l- k. a' I+ n5 B: Y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4