嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" d8 K. M0 D' s2 I; a7 d. ?
& j0 s( [" D; d( w% B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- r( D: h: T5 y* q
#include <unistd.h>
6 }4 ^( J2 T+ B4 C$ r4 ^- [
#include <sys/mman.h>
j g. P% c$ [$ L* G4 a
#include <sys/types.h>
8 M( Z. Q& k: l. D
#include <fcntl.h>
8 W: k1 @+ k6 w
5 l/ K2 S& O* M; Q
#define SHAER_RAM_BASE_ADDR (0x80000000)
; Z+ I: Q X4 D, V
1 i/ D# \) a5 G
typedef struct
' T$ U0 |8 Q4 R
{
9 N4 l) U) F/ f4 h0 Z
unsigned int a;
1 c( W5 T1 q6 c$ W& g: Z; I: C* {3 b
unsigned int b;
8 u/ B+ H: f8 r; b0 H
unsigned int packet_cout;
3 f$ i6 l( G3 a0 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ H6 _' F9 V4 I; I8 |
2 s# j! R- [& f# J) v- O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 w7 x- x% X' `0 }( H8 A) q
unsigned int count_copy = 0;
* Q" B* F4 r; j- Q
1 c$ s( y2 H }" i( T- Z
# n! @* H, U( S! f* e
int main()
' `5 o* N8 {8 h: S2 j
{
0 p6 q, m2 Q( @/ x
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 M2 R8 v1 P! N5 b& a( I4 Z
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; P7 k {. f r, M5 ]4 u) O
! `3 T- \ J; W: @. \, {
while(1)
- r/ s! [0 M; e% s* c$ M6 d+ Q
{
+ O6 Q+ `, G' D& U- o
read_MSG_buffer(pshreRAM);
# Q3 C1 q: x1 r' k0 v3 B
}
/ W9 w* O" b( |: r |
}
l0 K7 R' X% c. r" ^9 _
$ d" I; c7 d9 o2 _# H% f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 m; r$ l1 q5 j, U9 r
{
! D+ }# n9 o" b! o7 D$ Y
RX_MSG_PROTOCOL buf;
! E0 f- [3 r- x5 T! U
( W2 d6 H" N! b
buf.a = pshreRAM->a;
/ r. F0 H: S2 A+ U; S; `. S
buf.b = pshreRAM->b;
$ j2 a, |* S2 f) q0 i( v) m' ^
buf.packet_cout = pshreRAM->packet_cout;
4 p3 c1 G5 y( i0 _
- q1 q$ d0 ^7 `' `
if(buf.packet_cout != count_copy)
; X/ b' c" z. a. g
{
) k1 H/ s$ i# W/ b# x% C0 P& ?
printf("a is %d\n", buf.a);
# L) g! D, Q" W
printf("b is %d\n", buf.b);
# M& b; q4 p& j
printf("count is %d\n", buf.packet_cout);
. y ^6 H' E1 V
count_copy = buf.packet_cout;
2 E/ S% x6 [+ R* e) V
}
* o: I5 z$ L6 ^$ A6 [
else
6 V4 v" Y& j4 H
{
9 e' }5 k) p6 G& U: |2 \
printf("No effective message!");
' V. h4 x# Q* a6 y. S
}
7 y' I+ V u& o! Y' @2 V( k
}
4 v3 }; @( \" J* K+ m4 E0 R) [
! n+ v" }; o' w) f+ W- q9 P
' m x+ }( W& H: S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" a: W0 ?: S* k* a9 `
使用下面代码,对内存使用了mmap函数后:
% G: ~, V3 B T" e
#include <stdio.h>
3 j$ O2 U$ {% _2 R7 E
#include <unistd.h>
0 \+ P P: s1 ?; @) t1 `
#include <sys/mman.h>
0 p) d2 F6 e' X
#include <sys/types.h>
4 i3 J* e8 u) U4 Z$ F
#include <fcntl.h>
! W; g. W2 Q7 t; L9 E; ~) f- t, V$ S: {
$ K9 Z3 | w: E D* L
#define SHAER_RAM_BASE_ADDR (0x80000000)
% E+ r2 V% a0 Y% a/ G7 w$ U3 D
#define SHAER_RAM_SIZE (0x20000)
2 [5 J: r: O3 j" u' [, w
& E7 R4 ?' h: {% k
typedef struct
3 ~0 N; ^! e- j
{
1 @' r! q7 M& f* {1 w
unsigned int a;
1 e5 c! X0 v$ A, l$ u
unsigned int b;
, w+ T! T% |' \% `8 ]8 m/ Y
unsigned int packet_cout;
, H" ?! r2 S8 v) [. i0 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( Q" V5 }% P) v) e+ \
0 e4 Q, W0 r7 d5 D; A$ j3 a* v
void read_MSG_buffer(int *baseaddr);
" ?, ~7 P; p" `- Q% z$ _
unsigned int count_copy = 0;
+ f; M; s* U# o. w# W- Q
2 R+ g( B: K5 \8 a/ N8 L
int main()
+ F$ N+ Z& P8 T
{
1 v) H& l s7 m
int fd;
- L6 n, n |/ y! v
int *mem = NULL;
4 M8 @4 T: t3 L! _
6 E! } K9 n6 Q( K) \6 ^# i
if((fd = open("/dev/mem", O_RDWR)) <0)
; y2 m5 b/ y" F3 t* Y
{
* a! S5 `& j. r* |7 b4 K
perror("open error");
; _! o9 p! c* X8 E
return -1;
+ {: P/ v) S% f5 [
}
0 u$ R9 W7 _: h) O `
) C- O: O1 a- j& _$ l* h: }& I! W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
M3 g7 I4 K! P8 a2 F$ m
1 o5 W5 \. v+ G& S1 v+ d G
while(1)
! w: \6 F( Z, P+ x3 l8 y3 x- N
{
& E9 u, `/ U$ d" h* h t
read_MSG_buffer(mem);
9 t$ Q8 x8 o3 d' f2 N9 u- O
}
0 O/ O1 |$ V. P+ Z: }
}
1 ~* I# @3 F1 ^: ?0 O5 U
( Z3 S1 T5 o# [
void read_MSG_buffer(int *baseaddr)
9 \: X/ F2 j9 q) |9 h _% H
{
' s$ [$ r" G. }# t
pRX_MSG_PROTOCOL pshreRAM = NULL;
- p# ~) x; o4 h0 c$ M; b
/ X$ m- C; x4 R, W' k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 q5 D/ N$ [% i
" z, X1 r9 n, k6 S$ L) j- T1 f* c- V/ h
if(pshreRAM->packet_cout != count_copy)
: g, R1 F5 w. h1 u3 t& D
{
+ S+ Q. Y& t3 V+ U
printf("a is %d\n", pshreRAM->a);
& x/ q9 K3 a5 O
printf("b is %d\n", pshreRAM->b);
' ]% a$ A8 N* A% i
printf("count is %d\n", pshreRAM->packet_cout);
$ ^& j) r& ?' H! O8 _( r" E) d' U
count_copy = pshreRAM->packet_cout;
5 o% _1 Y% D8 _, F
}
2 F% |1 \& }$ e: Y7 _
else
6 w7 \9 R& s) \0 h7 n' M
{
6 ?0 b2 ]& e/ ?5 }
printf("No effective message!\n");
5 L6 p5 ~4 C( ?" n+ j& f
}
2 \" k) u% P8 E% w0 m j) D8 L+ r
}
8 O- s; u; Y9 {' o0 Q& Q+ g' }! P4 v; G
; t8 C! g7 ^! K: N& o7 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% q* j) Y+ O1 u
7 {; T. c6 M- |2 R- {( Z! j. L
7 O9 x# J2 T( q9 t& a& |1 [
3 Y* _- G' ]1 _6 W8 g O4 B% Q
& |8 Y {3 f, q: k: Y
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4