嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ Z; u; ?( E1 ~1 ^. M+ Q) k# p
& w: e, n' x2 w l0 I( H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 R2 i* p! Q. E! ?" L: s v$ f' [
#include <unistd.h>
6 c2 l/ \5 ^/ c! H/ a9 J
#include <sys/mman.h>
6 j3 Q; s O. u' J
#include <sys/types.h>
* y$ K" X# }9 t
#include <fcntl.h>
+ @# i+ D; g7 X3 h! H3 L, E0 u
; W4 O4 p/ `, P* I
#define SHAER_RAM_BASE_ADDR (0x80000000)
' K$ ^5 ]1 O8 Z2 E( t
! S0 K/ R5 p" X3 n
typedef struct
9 h) {& M' N* G7 g6 H4 X+ n* L
{
/ E. \9 E7 l4 K: R
unsigned int a;
: s" L2 j8 x0 |! M. {7 C7 X$ p
unsigned int b;
: h) s. y# L6 ?8 z6 \9 R4 ~; j
unsigned int packet_cout;
6 n5 o, M8 ]8 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' L' s- b+ |9 {
: g* F, \: {) I! E/ ~7 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 A0 d) A! K& S# M% u
unsigned int count_copy = 0;
: D; }2 g3 z% |
3 {5 q" [; F! t$ M+ D% j
8 m% g2 X2 q/ K4 d, V& H1 y
int main()
; F+ D! D E; d" O$ X1 o
{
+ u6 p) r g3 r, k g6 n4 D
pRX_MSG_PROTOCOL pshreRAM = NULL;
# B/ `3 y, z5 n3 z9 D6 t0 B" k1 \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
# L( S( j) m# P9 I4 R) n$ T
( T% C! T0 O# h2 T! i# }
while(1)
! I- }# p* ^- i6 M
{
. D7 T. E( e4 W
read_MSG_buffer(pshreRAM);
+ [8 k4 ^9 L, N
}
0 E* s% L m( Q( a
}
/ c; g5 D+ p+ k5 Y* V
- K8 d1 M z' G% X0 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# |! Y: U: |; [: c9 z4 f( F! H/ m
{
/ B# f$ j* y, l& O& b9 W& _
RX_MSG_PROTOCOL buf;
) X% {3 Z7 F& s
- T0 N; h. ^: E6 V: A8 V' r2 ~
buf.a = pshreRAM->a;
9 y& B; T( I( {/ w( f+ i4 I6 ]
buf.b = pshreRAM->b;
9 p8 ^# x2 f8 N" Z; ^+ }
buf.packet_cout = pshreRAM->packet_cout;
; @9 H( ]- |3 S; `5 r
) W( l8 b8 X+ C. S6 Y
if(buf.packet_cout != count_copy)
+ D) X" o) Q+ f/ [
{
6 A+ r/ v6 w% q4 H
printf("a is %d\n", buf.a);
& u }! C5 }9 V x, p; u4 E
printf("b is %d\n", buf.b);
- N+ B- h9 q% R. m8 u" z7 O0 w* @
printf("count is %d\n", buf.packet_cout);
8 j" [, j) G+ V# y5 |- d* K. q
count_copy = buf.packet_cout;
0 @' b$ K1 f2 O' S
}
. q7 K7 j1 A) b; B8 \$ {( y; ^! u
else
# Q* _8 }& G, T. J4 o
{
" L( X7 B, C( C, F2 A) [6 o5 r
printf("No effective message!");
0 Y2 J% J9 A; { h) a
}
3 v! m9 s, R: k3 X
}
' P/ r4 S& K/ I2 |! p
9 B3 Y( H8 z; K% p1 N
6 |) F3 e( n6 G6 N& B9 q9 O1 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
v( f& G5 m8 T; } g) d1 l
使用下面代码,对内存使用了mmap函数后:
8 V; s% L, Q5 P
#include <stdio.h>
! o0 A+ C, w0 D2 L' b- s
#include <unistd.h>
* z7 \" P+ G- w- M
#include <sys/mman.h>
6 [ K7 w( X- C3 W( _* t, Y/ Z- {
#include <sys/types.h>
9 Z l3 W, l& G) F
#include <fcntl.h>
, R1 m5 w" E; @0 a6 a( q+ x
9 k0 k0 A, N- \- s$ q" G
#define SHAER_RAM_BASE_ADDR (0x80000000)
Y# v* ]6 F7 q. e
#define SHAER_RAM_SIZE (0x20000)
6 [; \+ Y( Y: t9 b( @
, u' j" ~. r/ u4 T, ~5 b }
typedef struct
% |! w, E5 F a
{
7 p; K, ]7 u; F" o* L# R
unsigned int a;
- U F! o6 d0 J# N% T9 _: l
unsigned int b;
9 ]- }5 f' w" m' Y, Q
unsigned int packet_cout;
2 h0 o6 ~! B0 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ O9 G6 \; D8 @2 w, U
2 Q4 ]4 d% C1 ~% m
void read_MSG_buffer(int *baseaddr);
- N: S" `. e* h6 m+ S+ E9 }5 e
unsigned int count_copy = 0;
" n4 `: b: w# b+ x: ?- d
& @: R0 T; s) [! y0 p8 N
int main()
1 m O& N+ A2 j1 a8 A
{
6 @% W+ @! z1 G" z
int fd;
* P4 x2 _6 }7 f5 S$ u2 P# j2 a
int *mem = NULL;
" O" m3 Z& k" C: T. a# f
( D( G7 s% d, a
if((fd = open("/dev/mem", O_RDWR)) <0)
$ h7 k0 y. B/ T- W; l
{
3 ^. O9 v7 I" M. P; D+ y
perror("open error");
' n( V5 t E; E
return -1;
* s/ t x7 L. G7 O: n0 `
}
( j4 z1 _1 b/ _, h/ X7 R
* [* ~# |5 O6 U# ~; `
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 e3 i& M+ f( L* z5 s
% V0 E; `5 E5 a9 w
while(1)
+ Z; }1 D4 V; D- v; ~4 i
{
4 b8 Y6 C8 P3 c* G
read_MSG_buffer(mem);
* S, k' K# |0 C8 I
}
( h% N. [' m" X; j
}
& I8 Y l% ~, ~9 h E5 M3 ^
- Y& V' e+ T. u' e
void read_MSG_buffer(int *baseaddr)
; p/ }' k# _7 Q4 w0 J
{
# s" U: O3 [# O# B
pRX_MSG_PROTOCOL pshreRAM = NULL;
# i' l* k& I; `6 U' g, V6 z+ o$ H, M2 ~! p1 G
& J8 v/ ~8 ^1 g5 Q- _' s3 F
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 r: |5 {. p" G- h
! ~- c' _0 ] b# T6 \
if(pshreRAM->packet_cout != count_copy)
3 B! S" p: J8 ]3 w @/ z
{
4 a& k9 Q* R: c
printf("a is %d\n", pshreRAM->a);
; X' p' S+ K8 P! A% l" l$ d( q3 N3 Q
printf("b is %d\n", pshreRAM->b);
* T# @$ F$ q, `
printf("count is %d\n", pshreRAM->packet_cout);
; O4 j6 `' G( o9 S2 T1 c; P
count_copy = pshreRAM->packet_cout;
/ |$ L! r( L3 L! H/ V) O
}
: a8 K; C' Y S3 d, Q6 J1 G
else
; M6 a! T T" c) U0 Y
{
0 P, c' r! N- j, X( H' w( q
printf("No effective message!\n");
: P! w+ Y: u& h, c D
}
1 V2 W/ v( l* \+ q' N$ W9 @
}
6 I" l( s, a6 M! ?: w
# C# H9 l' v4 {5 G! V: o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. \5 P N# _) N% \" u! ^9 [/ d
0 d, b) C d8 @6 u7 X
- N! b0 I# _3 q9 j) B; o
0 a+ w( f8 }3 W- U6 Y; K& P
: T5 p* I* \! u/ J) X( G* u4 ?
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4