嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% H7 P; E( d. O
' c" I, T* o" D) m( R& u1 K' F
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; _: y9 \+ M- m6 h$ m6 \3 l$ R
#include <unistd.h>
6 {/ H0 l7 u+ l, h3 l+ E+ w
#include <sys/mman.h>
# u( c# J+ Q6 _1 X1 j$ X1 `
#include <sys/types.h>
; s. h# {& c/ p
#include <fcntl.h>
" A, m# g& r2 w1 E
) n$ Y' n* P! D9 H$ C
#define SHAER_RAM_BASE_ADDR (0x80000000)
" `. g2 K7 y! k+ m6 ?5 l6 R
5 G3 I- f; z! j! w- G9 p
typedef struct
' r: n* ~9 V B3 z R8 I
{
% y6 X; ?0 `: l/ I4 e
unsigned int a;
5 G7 e! @% n3 S8 U. O8 ? s; X
unsigned int b;
. V6 |% q4 K; Q$ x& E2 E8 |
unsigned int packet_cout;
( r2 Z0 N# K, ?' E( Z/ P; G- f2 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 x6 l0 ^+ b9 o# T R- j" J
" x9 M6 N5 x9 a; @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 G& [7 b" H) t+ J
unsigned int count_copy = 0;
; m( Q; [& ?4 C% c. Q
7 z: J" I) \" u q$ {( h
: ?6 R) n S- v4 c
int main()
$ w% ^% s; I, V5 e7 l( r$ x$ J, A5 o
{
" i) D& c: s1 w8 Q( x% m1 a( n
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 p& y" L4 S+ w! J0 e. F7 [
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 ]0 G& M: Y6 [! v7 I
1 i' y* M C7 H
while(1)
4 d4 D5 b7 g+ a# u/ s0 q
{
8 E1 ~3 [9 x4 a% L* l6 m3 y4 l. C
read_MSG_buffer(pshreRAM);
9 T2 _. d3 z- j! o- p! [8 U* e
}
6 S$ }0 g2 ?) D7 H# _
}
6 K/ |* C9 f3 M/ T# _
1 K. ?* X4 K+ g7 h5 [, V1 T# m* n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# u4 U% D# f/ ?' S
{
/ y/ i' }; ^. K9 {
RX_MSG_PROTOCOL buf;
6 V9 i6 K8 _; e p
# u, N8 r3 u$ @" w' j8 h
buf.a = pshreRAM->a;
1 \; m$ [' g! o; s# t* d
buf.b = pshreRAM->b;
~7 v3 e! d& a1 Y
buf.packet_cout = pshreRAM->packet_cout;
0 n* y5 I& B: v4 u$ {& v
! _3 M9 |8 z( W+ x* ]
if(buf.packet_cout != count_copy)
" i, w: G. Y% K8 e
{
! \4 x; Z9 c( {% p+ g$ `
printf("a is %d\n", buf.a);
' x' f$ c) o; {) N" M3 `
printf("b is %d\n", buf.b);
6 D! v# r. m" Z
printf("count is %d\n", buf.packet_cout);
- ^5 n( E% t1 r
count_copy = buf.packet_cout;
6 g- o4 J; C0 @7 c) \# D
}
) P ]" ~7 {9 T( {. z9 X, ~
else
. P! O( t9 I- c. A6 W+ }7 _
{
2 r6 e& s7 A* S/ `: `
printf("No effective message!");
) |3 m: ?' o) @+ T: h- c5 h; l
}
f4 n, I- e; D6 T( `# @1 z
}
: ^; b5 b6 w7 k4 C
5 Y! F$ ^% Z/ O1 e' ^
' g& }: v* C7 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 z4 B7 A" D; }+ i# E: ]
使用下面代码,对内存使用了mmap函数后:
) f6 K9 n# @9 U& a
#include <stdio.h>
0 S. j0 u/ ~+ l( S$ C( i
#include <unistd.h>
8 V( f/ K5 k+ l, r2 z0 g r
#include <sys/mman.h>
9 ? M, V1 T) |/ E; ~/ P
#include <sys/types.h>
) J. O- g) _ C8 P( X
#include <fcntl.h>
, `* n" j' R6 v+ A( j$ W
1 i; j: o, }' h$ h. }
#define SHAER_RAM_BASE_ADDR (0x80000000)
. e y; `1 p2 |/ V
#define SHAER_RAM_SIZE (0x20000)
/ I2 {% S/ E" s9 U
# `3 }0 b$ g# Y& B5 E1 p' H
typedef struct
. P4 T% \. u, R( h% C" P
{
. p& J6 L' M/ P9 W2 h: c- e
unsigned int a;
1 e% T' w- ?) |- E# o" `
unsigned int b;
! H& U) W8 a) a+ W. x' h6 L/ O
unsigned int packet_cout;
; r' b" P) ^/ s# W7 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, f; U5 ]+ d1 N+ P/ f
; x( r+ q7 }0 a6 p A. s
void read_MSG_buffer(int *baseaddr);
9 l _& W4 s T+ O0 i0 e
unsigned int count_copy = 0;
8 ~2 d- Z) D' a" M, U3 N) A0 @
/ c9 @9 j: }7 r: N- I8 Y1 O1 C
int main()
$ T$ v; J" R; I `! T! R
{
|" e9 z( X/ c
int fd;
) b4 T$ ^% i7 ?9 S& `( g
int *mem = NULL;
: @) k% B) A9 k. W4 j
6 f2 ?; p* Y$ n$ g3 Z+ S
if((fd = open("/dev/mem", O_RDWR)) <0)
) B. U. c W# f3 O# m/ B& G
{
) Z, \5 }+ t8 f
perror("open error");
" x3 h3 ?* h, F
return -1;
; m; H' @& A7 A9 n! b
}
l( h+ S( r/ t9 _( s6 M/ H- \
" q+ ~7 C7 g; U
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 D C. J' ?8 r% \, `( F5 c
' v, u, y2 w) X) N6 T- N d: |
while(1)
& ]3 A7 k/ P h, D6 S
{
7 M3 c6 N5 n& x+ ~0 h# C9 K# I% K
read_MSG_buffer(mem);
) n, i" g( H3 h# P$ `$ q+ b* H
}
- O% O, C5 v4 o6 `2 W K8 Z5 s, J
}
- Z7 ^* D! H, l5 w4 x1 F. T/ e
[0 ^ |9 h; x7 J, b/ [
void read_MSG_buffer(int *baseaddr)
8 m, P1 X7 A0 ^$ ^4 H5 h1 j( O
{
' H$ K$ b& u; k# n5 \- D8 z" e+ K, X! n
pRX_MSG_PROTOCOL pshreRAM = NULL;
6 d/ \$ z1 M$ m. A8 c9 x, m9 ^7 \' z
# Y( M0 T$ L' Z. E9 k/ Q6 s' Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 _" N1 |% C; k2 n% R2 @
% ~+ S( D- A& ]; a! v
if(pshreRAM->packet_cout != count_copy)
" L+ ^! G$ m6 `/ y& A2 K, j1 {1 l
{
' q% M- w. d2 C! x- M3 E
printf("a is %d\n", pshreRAM->a);
- x3 n4 x: k, g& P3 U! h7 Q8 ]
printf("b is %d\n", pshreRAM->b);
1 }: F2 p& ~. |/ J: O& Q1 w! |
printf("count is %d\n", pshreRAM->packet_cout);
% r6 w3 B( Z0 T
count_copy = pshreRAM->packet_cout;
4 Q- N( x( {7 S! x+ j
}
; |% @( w8 R% W6 |5 R
else
- t! m9 r9 i) K( E6 L
{
# N: c& q0 U# F$ J1 d# T6 P8 ^
printf("No effective message!\n");
) V* L7 e8 W- Q, |4 h
}
7 X [: X: e9 V/ ]. J3 H$ s4 o& P
}
+ z* W: |& O$ }* r( M+ c, m) \: @, D
% L4 m: |$ Q' Z1 U% {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 Y: n% o- A( t7 ^" D7 @- Y, V4 [
/ _9 R' V6 ?7 W# h0 Y
; C M- x/ I1 e8 c1 b* _" A
, K! \2 B2 c1 q- Y8 N0 J
2 p* g( n+ d; t* a0 b) {' S
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4