嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( R: l! o4 n$ V9 v
& U3 x0 F% j" q, r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 T9 h, z( J1 ^( D
#include <unistd.h>
' C1 E0 x% q! a: a" J" s
#include <sys/mman.h>
. u. d0 Q1 l# t3 B Z5 d' Z* A
#include <sys/types.h>
7 U0 {* L) M+ u0 q& w! ?
#include <fcntl.h>
! r% X2 f5 x0 d! P( y, U
: b! H; i7 G3 u2 U% ~- B- @( }
#define SHAER_RAM_BASE_ADDR (0x80000000)
7 m) j& E2 K$ M* a8 Y! v) R
6 P/ J8 e- Y$ F: ?( H
typedef struct
R2 g% y9 v" Z4 B
{
: }$ z p1 U- f) `& S
unsigned int a;
- e* ]$ q2 x2 t! b3 A
unsigned int b;
; q. K; V: c! W" O. A: w) E
unsigned int packet_cout;
* s! u9 K9 R! g' A& P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' {/ n# p6 M5 B& H9 T
; r, W# I) k( `% T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' h: K5 x7 |& r1 s" j# u
unsigned int count_copy = 0;
' A V g7 t- g' k0 P$ l! ]* B
8 y3 w& }% B! X
& _4 K6 ` ^! E+ P) o" e
int main()
: |; d8 j- m6 r- |: m$ Y* [
{
. a6 \9 M: p# Y4 R
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 U } t3 g. B% K& ]6 @5 l
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 \' @, M: N0 h4 m7 r4 C# H2 h+ u( {
" E0 V# g1 f+ E$ g
while(1)
) m3 {3 R$ x4 k5 e% [
{
, n, G% ?0 r% z6 ~2 P/ }
read_MSG_buffer(pshreRAM);
) w# E* a, H0 e6 F
}
, f- `/ L7 b: W1 _% Y) P
}
/ m( l: e+ m* C x7 Q
: w/ Y4 z9 Y0 U4 \9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 R# f5 u8 `+ c. ^7 G8 `
{
0 F# t2 M. P( f/ E( R6 u! }* y
RX_MSG_PROTOCOL buf;
' C( b9 q k; r. n( U; ~9 i6 |
+ i9 }: Y6 h6 f* J, h5 J7 m
buf.a = pshreRAM->a;
1 s K) M& z! W, F( ^
buf.b = pshreRAM->b;
4 f' B/ F/ T+ g! n7 p
buf.packet_cout = pshreRAM->packet_cout;
: C( i5 l: u% _0 ~
: c# b- L( c! l' m4 t1 V
if(buf.packet_cout != count_copy)
$ J7 `& c/ S# D+ g! Z
{
; [3 |* ?# G/ ^7 ^
printf("a is %d\n", buf.a);
; [4 `( ~# H; T2 C3 u
printf("b is %d\n", buf.b);
% d$ |( D% E0 C, g* A) d: T
printf("count is %d\n", buf.packet_cout);
`0 `+ b7 J+ {8 O4 ?
count_copy = buf.packet_cout;
9 l. C4 v. K T8 `- \3 Q3 j
}
2 G" G3 F! h2 u" n# X, r0 K
else
i: I$ R# d( U/ ]0 V: d9 E
{
- |3 R) \- M$ Y0 X/ i" U
printf("No effective message!");
( n* f3 X& n1 [3 k( z* [
}
0 A+ y, U9 _$ a% a* {8 @
}
$ z- X3 @; H3 q0 W1 U2 S" H
9 }0 U0 G p, L. L
, M2 _8 k6 X" X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 b& u+ q8 J7 q+ Q
使用下面代码,对内存使用了mmap函数后:
" q. k6 i' ?2 E% _! S+ M
#include <stdio.h>
' U! x9 P: @" [- e2 R5 z4 e5 {+ v: L
#include <unistd.h>
4 U. e1 v4 F% e3 [% M5 Q1 D
#include <sys/mman.h>
; h9 z0 _1 ?) E2 i F3 U* W# h6 V
#include <sys/types.h>
7 m2 D8 [7 z4 [# l& B7 c
#include <fcntl.h>
1 ~ o S4 e# t
9 k( n1 `' S9 D) F; m* m4 d' \
#define SHAER_RAM_BASE_ADDR (0x80000000)
) \; z5 z' E- v3 h
#define SHAER_RAM_SIZE (0x20000)
- Q: v7 F+ ^; j' q& ?) }/ i0 U
3 `3 A; Q) U# v9 w$ g, ]3 E
typedef struct
/ v3 i! Y3 u& a7 a0 [" Z; x8 R
{
- `0 J b0 N" H7 e7 G" W) }
unsigned int a;
P! p- H8 I: u8 _' {8 ]& _) A
unsigned int b;
, d# H( f [$ E1 a, ^+ A, M+ K( P1 X
unsigned int packet_cout;
8 ?1 Q' u. \* I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ h" s0 [. U9 [
+ Z' _- r: x [6 l
void read_MSG_buffer(int *baseaddr);
4 h8 `$ ?/ B' k* D c! I
unsigned int count_copy = 0;
4 K5 { ~; \7 x
: P, E( ^/ R, O- T
int main()
0 f1 P* d4 k, V+ X3 c
{
2 ]0 l) a# {& b5 E) F( D
int fd;
6 j* C* ]: M1 i8 S5 ?- I
int *mem = NULL;
' y1 D* R- f4 h1 ^% I; Z) v/ t
" c; u/ m7 A5 [& e/ k' f4 Z
if((fd = open("/dev/mem", O_RDWR)) <0)
/ J2 E/ t: Q4 l3 |
{
; Q$ y' h c1 k! |1 Z B0 U) Z1 t
perror("open error");
4 @0 [: ^ t) S& P7 L
return -1;
# G# s5 p. D; `4 ~) [, t0 e
}
/ v2 p+ h3 |6 g
; y8 Z; t0 G' {3 d$ G0 N. q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# I, W' p" i* W+ |3 P
) U: r2 e- c: W! V
while(1)
% A5 t4 a) o& B$ g$ ?
{
3 R$ {, O+ o# y2 u+ Q% O
read_MSG_buffer(mem);
. {* p( O) F% s, T) m4 ~
}
' ~/ e* E+ [7 `2 ~# T6 ?
}
( _& i; \( l% k0 ^4 `2 v
: V- B" a1 {3 p \1 q$ p8 j6 c
void read_MSG_buffer(int *baseaddr)
" ?7 B5 f/ V! ]
{
$ [2 p! ?% E7 W# b
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 |$ r. Y# i+ }3 \
- K' D& w' ^: N, d& ~' \+ P' q$ v/ \, _
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 b0 R& O! o4 H' A& [$ ]7 E
( K' e- W2 a7 x4 {$ J
if(pshreRAM->packet_cout != count_copy)
+ A/ z b9 G3 k& v, n( l
{
& u' [& p2 s; w) r; a
printf("a is %d\n", pshreRAM->a);
2 E8 N0 m- G" R
printf("b is %d\n", pshreRAM->b);
1 A1 B0 B, m- M7 k R. M
printf("count is %d\n", pshreRAM->packet_cout);
' m/ P8 M7 c6 \5 E* H: m' x2 @8 `
count_copy = pshreRAM->packet_cout;
' m, k& p& C, U! u
}
, w# G) e$ b9 v7 h+ g6 ^ p) B' d- J
else
9 J6 B. t s/ n6 p( \' B/ ]& J
{
8 ^ v# h$ w0 E K9 p
printf("No effective message!\n");
: O; I) x* P9 ^1 _
}
6 f. M+ i- m( x3 L$ w* S
}
1 [! L2 V7 W8 b
. x5 i+ M+ u/ U- }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 ^% ~6 X* q% W# }$ ~
) X/ h* e# u+ U+ Z, ~; F, P3 A& u5 y
) N3 q) o8 x. Y [. w$ G
, ^5 C! n: q) K; M; T9 Z
r4 }- T# j J% T6 D2 f
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4