嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( ?2 P; E/ i( \& p4 H" ^+ e; l" }
9 j6 \6 y G2 y+ o% K" t' H9 O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 ^! Z4 c. w/ ?: _$ `
#include <unistd.h>
2 m! o) ^; C, T& \
#include <sys/mman.h>
0 S7 _1 l- f: C
#include <sys/types.h>
3 X; s7 X. Y; Q5 Z* }6 G% o+ ~
#include <fcntl.h>
4 _6 R) Y$ \3 @3 J) ~8 E
1 z: F7 B$ g$ ]4 z s
#define SHAER_RAM_BASE_ADDR (0x80000000)
- k0 v7 ~# C- h
6 }7 [- {! B0 d8 s
typedef struct
9 X# a M9 p2 `( }( T
{
+ ]$ _# k$ }4 i: f2 O, _$ I
unsigned int a;
% O3 H# F; I' b( V. r
unsigned int b;
/ z5 D) f! p5 W5 I8 N" V% C
unsigned int packet_cout;
" }3 x a) @) x8 @% v. z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 B0 }! {+ I$ Z. |
8 i2 z1 M, E( G z- F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: k; w# R. K( n4 Z, J# s6 A- c
unsigned int count_copy = 0;
% S) I6 ?, x8 b0 I, Y
- \5 b0 x2 Q! o5 |
5 ]5 U: w9 |5 C% Z- J8 W9 |
int main()
: Q0 b2 x! g: E5 b, X2 H
{
2 ~6 V; _: y T: x
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 U& f1 \: O- h
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 o, [) r* y. i4 h* ~2 T$ }
i+ ]6 Z5 E$ g# V* E* J
while(1)
! C8 t9 V+ s' A, d2 X3 o" r+ Y: u
{
! ?6 E: u$ ^, H4 P
read_MSG_buffer(pshreRAM);
$ J2 E; l% U0 G% ?- K
}
9 P, X, A9 p" J7 e
}
/ W, c1 Q" Q/ r5 A: x r
6 B1 g8 {( b2 M1 A: Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 _" j9 S" j& c% F# N
{
6 A9 Q! k+ c3 w4 s! h" b
RX_MSG_PROTOCOL buf;
" J. Y. W+ F; A
! K S! M* ~! ~
buf.a = pshreRAM->a;
0 W9 i2 h$ D$ h+ u
buf.b = pshreRAM->b;
. d) [1 c# q, T
buf.packet_cout = pshreRAM->packet_cout;
, R+ q( m* f; o, K, s- G
$ b& I* i% j( i! n7 k3 g4 g" G
if(buf.packet_cout != count_copy)
: Z+ k; c! i4 F! E& K$ a6 w
{
, ]6 ^' V0 |; N* a6 s
printf("a is %d\n", buf.a);
5 H4 Y; d$ z7 x0 k
printf("b is %d\n", buf.b);
& u& T! F9 P$ w [0 @1 W3 {
printf("count is %d\n", buf.packet_cout);
9 p9 T9 C6 v. b( H: I' l& K5 p O" X A
count_copy = buf.packet_cout;
& K- Z6 W# g$ J# W, u
}
3 @0 c& {: N7 p: u5 Q
else
/ }$ [+ }, w' }6 Q6 T) p; n
{
$ v3 Q5 |. C9 L3 T+ k$ g$ k
printf("No effective message!");
$ `( n& J# ~2 V% L& T* U6 I, `( i
}
1 M8 j1 O7 B* }/ r- f3 K' T
}
* e5 R D' k% f% q! |& T% J: o
2 V* k" A* _2 t. v
8 B. R8 P( c5 d g; e, y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 Y; ]5 d1 s" v
使用下面代码,对内存使用了mmap函数后:
/ L# l/ ^: {, w9 ]+ w: q2 g) L
#include <stdio.h>
7 b3 u) m% W8 p) T7 h( I
#include <unistd.h>
, T" c3 E; G; a; ^) \
#include <sys/mman.h>
9 O% P5 A# a" C: Y
#include <sys/types.h>
/ n3 q! k1 ]( S5 H( }, T# O
#include <fcntl.h>
& }$ I7 k; s" S1 s. g$ M
7 z' P# |% [4 F. C
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 @* F3 e, i. ^) J$ I
#define SHAER_RAM_SIZE (0x20000)
, P S- @* p) U S, m
& q0 w% P [6 {" G- f/ t; d
typedef struct
& @0 P' e: |3 [& e7 s: J) w
{
: d% b- j1 k+ k
unsigned int a;
. f9 W/ m2 @% Q
unsigned int b;
6 Q1 N9 e& Q" Z2 D
unsigned int packet_cout;
/ F9 ~% O' ~' P$ m5 o( J* l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ~8 f+ c( d0 j: s
, B g6 Y8 p( u- w
void read_MSG_buffer(int *baseaddr);
! U! b8 q* v6 J
unsigned int count_copy = 0;
& j) _1 d8 b, r, F) G7 M
" z# c3 A# K1 B+ g3 B
int main()
" L# e& g4 p( S! B
{
; [. V! C, [3 F2 S
int fd;
7 ^9 Q$ _8 x* p% @9 u1 }
int *mem = NULL;
. N) a& q4 `0 U
, ~4 S: W' A# k. J1 d. A
if((fd = open("/dev/mem", O_RDWR)) <0)
# D' s: z. n: F# l9 r
{
. |! ]8 ?/ x& m* C
perror("open error");
( p; t! V- h) V3 A* i
return -1;
0 P P5 i6 M! }8 }& ^* L
}
5 F+ f" g! l) X5 k) a4 @
$ G8 a* p5 G- O/ ?; _
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# g' h) g) h8 l, |6 f; }( [+ n
1 e* O- t3 a4 L" u2 u: t4 e
while(1)
: p. E5 W# J1 s+ \% ^9 w5 B
{
$ {+ s. ], S4 j/ c$ k7 r1 S
read_MSG_buffer(mem);
6 |7 j6 Q! r" H/ ]* {/ P: \3 X
}
G$ f; b# O8 y/ m
}
# F! K7 n0 w- K6 s1 ^
' W' }$ k* H+ w/ w* s. i# C, a# I
void read_MSG_buffer(int *baseaddr)
/ X: v5 z& R+ F2 x
{
, B2 C) {* a l+ e; S
pRX_MSG_PROTOCOL pshreRAM = NULL;
( \4 z' F3 k& G3 P: u3 u" R$ |% |
* K' `1 i7 ^( W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! N& {7 q2 C- D; t
. Q0 R% E* j, ^& }
if(pshreRAM->packet_cout != count_copy)
( p3 ]2 C2 T8 j. T' l
{
5 S2 B9 r; s3 G O5 z' x+ W
printf("a is %d\n", pshreRAM->a);
, }7 r4 Z( f. D" }2 T! J
printf("b is %d\n", pshreRAM->b);
8 I V6 J6 ^0 }) u/ R
printf("count is %d\n", pshreRAM->packet_cout);
" C9 R6 D n& f9 f4 n
count_copy = pshreRAM->packet_cout;
, w: f- j' R! |7 }4 k
}
) Z! O i6 ~3 w* C3 B7 x
else
9 N5 {$ E7 T( V% X5 Q
{
! a/ \* ?9 s' ~
printf("No effective message!\n");
; j3 W! s3 P" T1 y
}
6 v6 d, I7 a5 y/ n3 N
}
7 c- R) d; I+ M) d
9 j: d4 E( O1 J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 a1 y3 O+ G, L% Z
# q) `6 k% u4 d9 e0 ~
! r/ `: W# S: y; u3 J' S
/ q/ X1 [- `) ?1 I
! V: z3 }$ y9 e- J. T0 O
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4