嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
* Y1 a1 f: ~. J5 t7 u1 s
$ W( w$ u! W+ C4 |! L) P. l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 X }% Y0 {6 a* H. ?+ G3 u* |( O
#include <unistd.h>
- R$ B' j O" Y1 O2 l) Q6 d g
#include <sys/mman.h>
' e+ b; W, O ~( K, m9 E! X
#include <sys/types.h>
% D1 \7 F: e# O N/ m- q9 ~# f/ u
#include <fcntl.h>
, }8 m( @- {5 I+ d, V g" c0 h
) ~5 [5 l7 ]) H
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 h) E9 J# g |- J5 r
& |4 }# x. ?, q. X
typedef struct
2 X" ]% D( K: A' E; U# E- c' F( y
{
2 d8 S) e; N- i5 k f
unsigned int a;
* `" r! L4 h. s4 |4 Z# ^8 h
unsigned int b;
) |' S+ R7 W8 e( p* w
unsigned int packet_cout;
8 z- W+ g5 l! I0 j3 h) m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 n! k( |/ ^$ {+ i
4 g5 a$ B6 C: Q$ e) D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( V( p# ~. P }! h, x; Y; ~
unsigned int count_copy = 0;
! Y2 Y5 R# E/ K% h
5 M! x8 m: W, ]( M
' s, Y% J# x @9 L" p8 u, H% h/ Q
int main()
* ]* @2 a# k' ^
{
! n4 q8 R5 w; X, `% J5 k: N
pRX_MSG_PROTOCOL pshreRAM = NULL;
# s2 G$ d# a, l% }* A! A
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ M% W9 a* K! d# d7 [& U0 L$ U
% D8 x8 d# Y7 b7 J9 ~- L" D
while(1)
, I! e9 {. t+ t; J# A
{
+ y: A7 _8 c) J
read_MSG_buffer(pshreRAM);
9 p) M5 c( D- v8 G- R
}
$ j: G# d: Q9 x( n
}
! `( d, B3 O6 j) v( ^9 s
8 y- G, J0 S" g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, |0 E. E/ u5 g
{
4 W7 Y6 D E, J
RX_MSG_PROTOCOL buf;
* [/ g3 z1 d3 L* t- e p; J$ r
$ e: g: f6 C) c" I" |& k/ Z
buf.a = pshreRAM->a;
' _5 Y$ i6 K* O. S
buf.b = pshreRAM->b;
* g+ U/ D6 d: e5 y( w" c
buf.packet_cout = pshreRAM->packet_cout;
! f- j+ a% Y# ^9 R
, A8 w6 b( K$ a3 k
if(buf.packet_cout != count_copy)
! r4 [' R# q# f& T
{
j* n: S, W" P. s# G, n2 u. N4 R
printf("a is %d\n", buf.a);
1 c$ ~, D5 ]; d& l* x$ t- [+ V* i
printf("b is %d\n", buf.b);
7 @1 c m3 `' l# @; d
printf("count is %d\n", buf.packet_cout);
1 }( z: \. A/ N+ \
count_copy = buf.packet_cout;
( u, ?, J% y3 d0 G* H7 f
}
8 H% P' K4 ~0 T* g
else
5 h! o* J6 J( L5 J% ^
{
8 B: s* K+ C9 L$ |4 D$ j
printf("No effective message!");
; N7 `; W6 P" H
}
) j/ ]8 }: e1 [- W" H0 o7 {
}
1 }+ C- _( k5 ?3 O# c; V
3 U6 e/ s; K" j7 O. o# O' ^
7 v" A9 p: s, o1 F' E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& ~# V; n7 a7 e& e% e
使用下面代码,对内存使用了mmap函数后:
; t- e S$ q; n6 I! t7 \
#include <stdio.h>
* M+ l t) }- P) z
#include <unistd.h>
4 t' p$ _0 a2 Y# S' ^; ~
#include <sys/mman.h>
7 Y# H! p+ { C0 f8 i& _
#include <sys/types.h>
# k" V( f* s# P# i5 B5 ~' f$ r, P
#include <fcntl.h>
* u, F+ K+ d! B) C
* ^/ @7 `8 o: Z& p' c) @" b- g( M& ]1 a4 V
#define SHAER_RAM_BASE_ADDR (0x80000000)
, S2 X3 F) G8 h2 f4 D
#define SHAER_RAM_SIZE (0x20000)
0 W* O- o5 H4 T0 s
9 h2 ]; q8 ]/ S" L! j" w$ P8 l
typedef struct
7 x* Q/ k k+ k* S) r4 \9 O
{
( |: O/ E$ e- C3 o: ^6 ^
unsigned int a;
% u6 e0 x( q ]+ F8 c0 i8 |/ e1 d
unsigned int b;
: Q) k5 H: k" w2 L$ l( p6 ?
unsigned int packet_cout;
3 y5 L4 B, k6 n! Q4 W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ^' p% W) D3 z1 s6 F* w& X% e% ^
' v; ?% ?4 p1 o5 F0 a3 S! b( Y. P
void read_MSG_buffer(int *baseaddr);
7 D/ I; M* M7 z0 ^' u
unsigned int count_copy = 0;
m8 }) J6 s9 j5 r
' [6 ^% X9 B4 @9 r" l; X% t! P6 I
int main()
% R$ ?% b* |# V$ m- A: x
{
$ o* I4 _, d6 T! Q# ]/ B
int fd;
! s: J& s" Z$ y0 c2 R# }
int *mem = NULL;
4 L* h: M1 b" k
5 ^- F6 W" Q, E# U# r
if((fd = open("/dev/mem", O_RDWR)) <0)
& J+ Y& h5 E) I2 {9 s: _9 T
{
( F9 G, ^, j0 s% p6 R
perror("open error");
9 h! I* u/ Q& V) `
return -1;
/ ^ k' M2 \# U( g' d
}
$ P, X( e, P% t' Y2 T6 H/ B
; O! E0 m7 W, D" ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 X8 Y# R, o' h; H2 F3 E
" c: e2 `" k! R6 a2 s: y
while(1)
; }) ~1 A [" g: |
{
' T3 F4 V$ T8 P- @ h, v7 L9 T
read_MSG_buffer(mem);
2 B: M" i- u* G0 d
}
- L& q% S) z" ], ]# X
}
9 e2 W* d, F5 E0 Y6 n
( g4 g5 r6 ~: [4 z+ D& d. e
void read_MSG_buffer(int *baseaddr)
3 M/ l+ ?* W$ g$ D9 V& h6 M8 \
{
# d; F4 Y% _% K6 L& N
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 X$ z4 ?6 T3 t; F6 r
! P# t0 r6 y1 Q, E6 e2 A
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 b, p4 O: u. c9 i' m
/ n" n- y1 S( y3 h4 D
if(pshreRAM->packet_cout != count_copy)
5 \' `2 y4 z5 a5 T) m- H
{
9 k, E9 l! @9 v
printf("a is %d\n", pshreRAM->a);
4 N" E0 s( G* N' @, @
printf("b is %d\n", pshreRAM->b);
1 ^" Z e( |' A1 k* W+ y& V6 ]5 k9 L
printf("count is %d\n", pshreRAM->packet_cout);
' ^3 g# o5 h `; G/ J2 _* ^+ r
count_copy = pshreRAM->packet_cout;
T, p: R* g* E$ F; r
}
; d5 Z9 z$ y1 [8 R
else
% F1 f3 r# E) Z. n8 p) u
{
" `/ I+ c1 Y% ?/ T
printf("No effective message!\n");
4 m* w) S, l7 O, s( I5 n% E
}
# i. V( i) w, y' V' I _" S
}
) j& Z1 w' I3 k7 b% k: I2 d
2 V$ J% n7 k, I8 b; @8 ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. F. h9 G; Y* U% g. o _2 G
0 h! C* O+ f6 I
+ d# @* p. p0 v+ X
. l4 H" I' E% x7 N5 v
- w" w O% O$ |: w$ Z
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4