嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% Y. j* a' E( i' T) A- ]
0 z/ c) j w; U5 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 i e0 `$ k5 p3 b- v
#include <unistd.h>
: a+ U! D% h; n. u- B) j" [
#include <sys/mman.h>
7 o9 k: r, x* g) C; P
#include <sys/types.h>
3 r0 v( Q% o0 D+ U# H. N- z
#include <fcntl.h>
3 c1 G S" w5 b& T- N
4 n" z4 b! j7 K: K
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 u: J' B3 M8 ]* [3 ~/ E5 q
3 z. f* e9 t; S6 ?* |1 Y
typedef struct
: ]7 Y# H9 p% N" v# d% l& z: k" t
{
8 g* N* X& {1 S M1 e3 _+ y7 C
unsigned int a;
! h" R! Q$ W' U+ O- W: P) p8 S6 d
unsigned int b;
4 r" m6 C) [8 Y. o5 b8 n
unsigned int packet_cout;
) f% c& u$ ~, {) V2 `) E1 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: ~* \: T, S3 O2 Z) H4 @
$ y6 B5 Y+ u! w! D2 v p# v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. L% v! p5 T: f- c( v
unsigned int count_copy = 0;
! p# H) l8 A( j" v: a
+ F% V% _! n! x$ F( Z2 S) A
- W. {( y* G1 q4 M
int main()
% Y8 D* A3 |0 g7 I$ Y4 o
{
/ }9 f- s. |# [6 Q; N
pRX_MSG_PROTOCOL pshreRAM = NULL;
; }# N5 F' P% W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
|. M* d. u2 j, G9 b
, k' B& ~5 r6 h7 k7 C) Y( ^: _/ s
while(1)
. I5 i; t5 s! h' A5 k3 d7 }3 }
{
7 P* Y- M" _! _0 a% [: E# O
read_MSG_buffer(pshreRAM);
/ P L, x$ F; x/ g; h0 `, ^
}
4 t+ k z7 q+ K* p4 G5 j
}
) N0 R7 l- T& [* b
" _! `7 ]: B) Q# A$ c0 v% U# @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. P9 R7 L- x- S8 h! F! I9 W
{
2 w2 F" F* Z/ j
RX_MSG_PROTOCOL buf;
# U% g( H D- |& ^0 k% b! f$ U
; ~9 R& F! F3 b( k, b# R
buf.a = pshreRAM->a;
9 @8 E, R8 o0 t: A8 Y3 u
buf.b = pshreRAM->b;
! u3 M; O4 f4 h8 O& S8 o2 B+ y
buf.packet_cout = pshreRAM->packet_cout;
) e& J- c$ O l) ?, B4 R
) ?3 P4 E) {( z$ T
if(buf.packet_cout != count_copy)
2 S+ w$ j" \% u5 g+ h& e
{
% a& j% q3 T: Z2 \% H4 |/ j
printf("a is %d\n", buf.a);
[6 B0 L, R5 I
printf("b is %d\n", buf.b);
7 i; T, D5 @6 L: [9 |6 I
printf("count is %d\n", buf.packet_cout);
9 T k* F" b) Q
count_copy = buf.packet_cout;
- E# @9 K6 E0 V& Z7 ?+ Q3 E/ _, y
}
* \( C$ ?4 s/ c; p& G
else
' c# m& p/ D) a. e6 z3 f
{
, w6 j [3 P* a6 O/ S$ v
printf("No effective message!");
2 t8 O3 U F) a. n' \( [+ i
}
; g' B, K+ \. @
}
7 m# B' J3 w* M% l) c5 T. F0 a f
5 X. R, N& }; A4 c
2 e2 ]6 \) G V" r |2 B( V$ `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 v3 U0 W8 H! d7 H
使用下面代码,对内存使用了mmap函数后:
8 l I1 A/ Y" u) C) p- N3 ~: z
#include <stdio.h>
6 }, e5 a' F5 E' Z+ \
#include <unistd.h>
! b* c5 M* z2 X/ m% ~" Q, i
#include <sys/mman.h>
9 b8 c r, X% a% \, M; w: f
#include <sys/types.h>
! k- ^( T5 t/ V' Z+ y/ Y
#include <fcntl.h>
/ T3 b' f: k* J( l8 E4 c4 v
4 e: X1 }$ q9 P, I' ]# e2 }& q
#define SHAER_RAM_BASE_ADDR (0x80000000)
' P f- j: T) q0 B4 H2 o$ z4 _
#define SHAER_RAM_SIZE (0x20000)
" d# o' \ Q0 d( S2 R. U l8 s
2 g! {( Z( E2 b3 u: r
typedef struct
3 e0 O8 F9 E2 \# A3 G* y. T
{
* d/ f7 R2 X3 ~7 ?+ [1 ]/ ]
unsigned int a;
2 l. B: F; H, K& | H
unsigned int b;
6 i4 p7 D, P) `8 P1 m' Z. o
unsigned int packet_cout;
+ X/ c! U/ ^' S7 ~! c) G; J( t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; [) v+ {0 f, D- w
: h6 g) d9 \) A3 D" K" p
void read_MSG_buffer(int *baseaddr);
) Y5 }9 U* Z8 {2 k8 r
unsigned int count_copy = 0;
2 F! x: f- [: y* w5 N5 [, o' U
2 f4 }' G4 T- U+ C% \/ a# G0 l
int main()
% B5 K5 R+ ?! i4 r1 v3 K y( Z' C
{
$ r, S v; O2 r
int fd;
0 t, A+ S8 v0 z( r7 p# U6 s
int *mem = NULL;
* Z8 C: R' y- g0 I2 o
; R' K: b- L3 Z: X
if((fd = open("/dev/mem", O_RDWR)) <0)
1 |! E. A1 I# K* [
{
7 K6 O) \4 V6 J& N1 e- W
perror("open error");
( T2 h+ Q$ A4 ?
return -1;
7 ?# m; C. E: s
}
) M. @# V! H+ j9 K% i- q0 {, k- w
4 S; r2 D/ o: P: i. I2 Y5 O! K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 D: K3 r8 B6 q1 x( J
* C. Q$ u# r6 E% w
while(1)
4 E/ J0 Z7 W- o. p- a; O0 Q/ M
{
* N9 h" A, V2 l" [! H- ?
read_MSG_buffer(mem);
& w3 y# ~9 @1 [) D3 Z
}
; d& t' `" ]. u: ^
}
# K; D2 A& b! X5 l5 l% o6 x
* g2 R; C; P' h) V( P$ k
void read_MSG_buffer(int *baseaddr)
# B x7 [7 o- x
{
# A" ^ K q9 e# p0 C; a$ u
pRX_MSG_PROTOCOL pshreRAM = NULL;
, @/ z$ B8 b2 F* t" M: M7 y
9 t, S, ^+ O. i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( j2 V& T6 I& r! I4 F
x( A" o# Y2 C/ \1 S5 a
if(pshreRAM->packet_cout != count_copy)
1 f% M2 H! w+ ?
{
' b2 \ j2 B N, J1 S* @# K
printf("a is %d\n", pshreRAM->a);
' L) c$ v8 A: q6 A: Y
printf("b is %d\n", pshreRAM->b);
9 q) H, q! j8 Z {: `$ H, L
printf("count is %d\n", pshreRAM->packet_cout);
$ r+ \* c S7 g/ @% K. f D5 c
count_copy = pshreRAM->packet_cout;
) _% B4 y0 o8 g/ f g
}
C4 w! ?8 h8 w$ `( m. v
else
. p& S# e4 g5 j: J3 @
{
% |/ }6 B! H4 b6 v
printf("No effective message!\n");
2 O+ p+ M+ D% Q( N7 n9 q
}
' \1 W Y, A9 E" ^8 d
}
# p4 z+ F8 g% t
% j. J% [4 E. Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 b% v' v; k( s' ~8 d" I- h
9 @3 |! A" ^2 \0 o# \
9 C6 a& S9 y# V) H
! U3 A& }2 c0 t
: ]9 m+ G% _8 J ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4