嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( s l5 M$ z/ w m! I# o
$ t/ W1 W W$ w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 z1 H$ B* s+ s' J" ^0 C' D
#include <unistd.h>
+ D! q- ^0 }; L; `6 f; n
#include <sys/mman.h>
9 R& E3 x5 e( E3 ?" J
#include <sys/types.h>
& I- q: V9 G8 B9 A/ N* U
#include <fcntl.h>
! b# ~ K/ @) o$ m) R4 x+ E# W8 d. K
7 L6 u3 R, V2 h" I* y9 T
#define SHAER_RAM_BASE_ADDR (0x80000000)
" z$ M- T5 P Y% c
% y1 l* E* `$ e2 ^
typedef struct
$ T0 V# o1 d+ m) }6 \7 R3 f
{
9 O) X" C* y3 N, ?
unsigned int a;
* C# a6 |; s8 G5 P$ C& t) {
unsigned int b;
, C9 K. ^( F& m
unsigned int packet_cout;
7 a: _6 z$ X/ L9 k# _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, F" c* `3 ~: z8 p1 Z( s* }8 q
- B4 A9 o( O/ W8 I9 e1 B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( E0 X/ l& M; L; `# ?- p0 P
unsigned int count_copy = 0;
: c! q. F3 Z/ G6 M* _& P
7 M* @& ^( L; d. j$ q# `0 Y
0 e. N3 l6 E8 W$ Y4 ? j
int main()
# Z; k4 Z- `! h" e j9 k
{
$ ~9 P% a1 y2 D
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 c. |# C: D1 E8 Z/ T# z' }* I: u
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, M1 W+ E8 B9 M5 I
0 ^7 ] ~& v7 U# H; C' r$ i
while(1)
" @- f! U0 W7 H% |# h8 ~ f
{
# y. _1 \, ~% G( j& o4 w
read_MSG_buffer(pshreRAM);
$ s; u4 I2 ]& U1 }* L
}
, X& x$ C/ a7 X
}
1 b5 P9 T, M- u5 [
& u- E Z' ^; B/ A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 Z3 C( B7 O' `6 A0 @; {6 U
{
+ C s! ~# O" y7 h
RX_MSG_PROTOCOL buf;
6 S" f; q3 t* @& }5 ]
2 X, c7 W j4 ]( z2 i0 L5 `
buf.a = pshreRAM->a;
+ W. P( U% `9 ?8 J7 h& ]' F
buf.b = pshreRAM->b;
' l1 c! o0 C) ~' e7 j, k$ h
buf.packet_cout = pshreRAM->packet_cout;
/ a" C4 B4 u- |6 T2 r- g- O7 ?# F
. X+ N" I, t5 v+ p! e& Y% ]; n
if(buf.packet_cout != count_copy)
* P. V" h$ C) L
{
& `5 G2 z. r. R" h7 H6 I- |( W. r) k
printf("a is %d\n", buf.a);
5 Q3 _1 M9 l( |+ y
printf("b is %d\n", buf.b);
) g7 Z$ o' g8 X) @% O8 Q
printf("count is %d\n", buf.packet_cout);
# G/ n- l) `& {- {0 n
count_copy = buf.packet_cout;
# `# W; a6 t9 u$ S
}
# [3 B5 v s) n% {6 i
else
; v( o& |3 [2 u$ H
{
0 V/ p5 Y- [7 R, `" t8 z
printf("No effective message!");
5 D Q" \) k% C; D' c& n" `
}
% \8 p& r& H' W" n6 {; k! p3 e
}
! k0 _9 n5 V) C7 }9 k3 y5 o# G
" R/ L9 i1 k, A7 B8 H) F
* {2 a8 ]2 H. @9 H. I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! W& g' C$ E. G1 b! F
使用下面代码,对内存使用了mmap函数后:
* x' u4 R9 j3 S3 [+ \
#include <stdio.h>
% l8 W! h& z) S- X+ r
#include <unistd.h>
, X* r$ l4 t! X. j
#include <sys/mman.h>
; {+ I. X- j8 a: v; K) ^0 F
#include <sys/types.h>
) b! a# K2 {) T0 Y8 Z
#include <fcntl.h>
6 Z8 t% R% r+ t! P- }
F. X" B z& D _3 o% i
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 z4 M1 g" u) `( P/ F0 d: I
#define SHAER_RAM_SIZE (0x20000)
3 ?2 ]# ]& ?4 a; ~* T/ n0 Y W
; p" F" x7 ]! A6 R/ _
typedef struct
- o a$ f( D$ N/ }5 Q
{
; F8 t6 R6 f8 j: z
unsigned int a;
: }9 z. }9 Y8 L! [6 B
unsigned int b;
& U( A* q- i) }/ k) x; {
unsigned int packet_cout;
* q) f" w- b3 ~0 p. W0 L+ {2 E/ L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 c+ B) `; W$ ^% L2 N
4 p! U' v' ]( a0 R3 |
void read_MSG_buffer(int *baseaddr);
$ m# ~, j2 @8 U V6 z0 P Y4 i
unsigned int count_copy = 0;
" \ P, i# Q0 X, X: n
. n9 O& k# T* H' ~! O
int main()
9 v5 `1 V0 P2 y
{
N2 o# W3 U. l, [+ d5 T# @
int fd;
: \ b/ k; y. h, `5 r2 t+ I7 B$ X
int *mem = NULL;
T: k/ T# E- N% x: d; @) \
) }- l. R* s0 U- R+ U
if((fd = open("/dev/mem", O_RDWR)) <0)
3 Q: z8 ~1 q }; v
{
% u- ~8 q2 f4 D& h7 }/ i6 z
perror("open error");
; r7 f: ~ T- v2 O W8 ^
return -1;
" X4 Y! i5 J9 ~8 E2 @8 G" m6 q& t# p
}
) Y8 V, q% W6 Z4 W s# o0 i* r
$ }) T& O. P( x( j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ I6 i" w) ^6 V& ?5 [5 ?* l
! Q0 n" }- C$ U4 F; n0 t; ]8 Y8 x$ F' m
while(1)
1 J3 j8 P9 p/ W, F7 R
{
! _# h. H4 B' V, m9 ? |6 O& w% J
read_MSG_buffer(mem);
; C; X* m5 I' J, R- m* j1 b
}
9 u& E3 G9 H4 p1 e& W9 e/ p- ?
}
+ e% G4 Y% a V* j* m& z
$ d0 j! c& O7 u. l
void read_MSG_buffer(int *baseaddr)
- c S2 n, ]2 q( z0 i
{
- D% w2 O: V5 W6 F, W5 S
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 U: {# ~% _! G7 O/ q8 H2 d8 i
3 G1 }, k6 h+ Z! P6 _; @/ Y
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 a# Y5 j/ J1 y3 a3 @( c
6 R) a8 d/ ]0 U
if(pshreRAM->packet_cout != count_copy)
/ F M/ d7 z# T2 x' H( O- G/ K& w
{
0 ^' d" S4 [3 ~. d0 C% L
printf("a is %d\n", pshreRAM->a);
- U2 ]% y, _" \: h4 q
printf("b is %d\n", pshreRAM->b);
0 ]- p( j$ e, f6 E- Q* M; X
printf("count is %d\n", pshreRAM->packet_cout);
& d/ C1 K; {5 d- w E
count_copy = pshreRAM->packet_cout;
% V5 t1 F, W- M$ x
}
T. U2 A4 R' s6 N& z1 _% ?
else
* |: W# y" s; y5 \$ D
{
: t. e7 m$ f4 g% e
printf("No effective message!\n");
- ^/ w+ t6 j; G
}
( A5 ]' f p8 h9 ?; z8 }6 }
}
# J, j- v ^2 s. b# Y! f7 F" F3 T
. q/ T" {/ u2 h6 F* B% z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ Z4 J1 r+ Q V" M+ L, c
" x8 v! q3 m$ D. k, o U. N' T
b0 _) [% x( }8 e+ ]
( N# X- K# Y! o) z9 U0 A) d
7 Q; F# `6 D* F5 |
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4