嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 d# l* z R6 Q L/ ^ v. p z
7 u6 ` b6 l8 B1 x+ k5 }: ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; m7 X$ G0 x5 B8 Y
#include <unistd.h>
1 {7 [1 z5 ]4 N8 O# p. g6 {5 A
#include <sys/mman.h>
8 O9 i0 m4 O! P/ m( F* M& Z6 i
#include <sys/types.h>
" D/ e' g8 F7 q5 T( r& v
#include <fcntl.h>
* o$ a- b* a% N$ \" {
" g4 f. E8 t6 F6 n+ U4 Z
#define SHAER_RAM_BASE_ADDR (0x80000000)
% X1 i: F7 j! y# X0 x. C0 o
. z4 x9 B+ H. `: s, j% t8 ~
typedef struct
: R" t& u, J' `0 y2 |
{
9 l" Y1 M# [% Q# O
unsigned int a;
8 R v5 a$ Z: D2 ~) U
unsigned int b;
: _+ l$ M# y8 f; t' e9 Q
unsigned int packet_cout;
2 v% X) X9 r' O& ~. H( K1 K+ G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: b! [& r. `8 q" N
+ C$ Z$ s! {* @. u0 ^! F3 l
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 m; U0 h2 y7 I
unsigned int count_copy = 0;
" S; i" }6 B; j4 S5 Y5 w' I; a# i
, }/ @9 I: J9 R+ M
9 c% n" F* {: B' Z$ S
int main()
* N! t' v8 T) |6 T" e
{
& C( S0 ?3 y7 u% m! z. c
pRX_MSG_PROTOCOL pshreRAM = NULL;
% D; t3 v+ I% K) _3 T+ {, c. |
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 I- a/ u4 ^5 i( H5 D8 c6 k
1 N+ _# j) \' I5 {& G
while(1)
8 }% C* O, B2 c( L$ ~$ k: ]
{
% R3 X9 w. M3 F
read_MSG_buffer(pshreRAM);
6 K% C9 W1 U% c2 ?" M
}
9 y( o+ F' A: |8 `0 L
}
: ^; w/ y9 d- {- N
4 P$ \ w$ W$ U" L, r! X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 A2 f- I+ q8 l) U% W5 }3 z
{
& y, `- I; X5 x
RX_MSG_PROTOCOL buf;
. Z: K- t/ o( Z- K; H/ d
' Y `8 H5 F0 W2 l
buf.a = pshreRAM->a;
1 q6 a; f. @) c' P2 s$ R u
buf.b = pshreRAM->b;
+ }) i" ^6 Q7 p" _3 ?# P7 S/ }
buf.packet_cout = pshreRAM->packet_cout;
4 Z; Z* X: K* N" O
# v& X3 c3 P% c5 g8 d8 Q
if(buf.packet_cout != count_copy)
" Z" ^ X9 u$ ^% B
{
0 ]& h. b4 Y3 y7 q
printf("a is %d\n", buf.a);
' B1 w( Z( y; ^ m0 G
printf("b is %d\n", buf.b);
2 p0 n, i6 _: o' x) d4 N2 O4 [' ~5 z
printf("count is %d\n", buf.packet_cout);
2 y* B) `+ U( N. m: a
count_copy = buf.packet_cout;
4 W/ N$ x5 D" A& F, h
}
# l" ~0 L7 {; ]2 F* E
else
) J; L! k. X* V/ P% G" I
{
1 z$ H! s+ Q4 x
printf("No effective message!");
4 H6 [$ Z4 x, N; X, q, y1 v/ x1 d
}
; h# A# u/ g/ v, j, Y' W
}
& ^/ k- d9 D+ Z6 f G
9 j8 N6 E$ h: B3 g
1 X! g( t2 H7 k+ ] b( y% m) Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ U. d- K+ d5 D+ U; i
使用下面代码,对内存使用了mmap函数后:
3 U4 A6 u0 P8 H: q% }7 ?, ]
#include <stdio.h>
9 c" C5 P$ `- F t; G" w1 |
#include <unistd.h>
: B* {9 _, a! w" l3 b- B) [
#include <sys/mman.h>
* h+ ]+ y0 j5 b
#include <sys/types.h>
; Y) k/ ?" x6 ?) S; S, j7 `9 n
#include <fcntl.h>
& L' y( q5 r& N+ m8 n4 X7 t
; r& _/ h: a7 s% t& \1 e+ h
#define SHAER_RAM_BASE_ADDR (0x80000000)
; `6 a9 [ _ |. s0 ^, i3 j
#define SHAER_RAM_SIZE (0x20000)
8 B6 {4 ?" e8 w3 }6 T
; W7 m9 y1 a, z! O) o
typedef struct
! F, [. |& H1 D& D* U; i
{
& a; E" b! ^; P3 z3 U" d' r6 i& Y
unsigned int a;
1 c) u: m- l& ~( |
unsigned int b;
8 |7 c+ }6 h7 @8 a: K1 C$ ]
unsigned int packet_cout;
+ v1 p/ d, B0 w8 [5 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ Z" x1 O1 k6 @+ O* \5 I
! U1 R8 G/ L8 q: g
void read_MSG_buffer(int *baseaddr);
' b0 r7 ]1 G/ L+ d$ z4 T6 c
unsigned int count_copy = 0;
+ V3 z8 k( u0 Q1 w
/ p+ l9 B. ?) c3 |8 _. d8 [
int main()
R- L3 \0 M& G7 k7 T, ^
{
+ O r" n+ B, q1 H3 ?* l4 W
int fd;
5 C( R2 F' |: f) _4 G
int *mem = NULL;
( w7 ~! K: a) m) H4 B
& [# N# J, ^1 c
if((fd = open("/dev/mem", O_RDWR)) <0)
3 L7 R; @( c9 A
{
. s8 G* B, i+ j) o8 ^! ?
perror("open error");
% w* b4 @: n& o6 K
return -1;
! S' k) d6 d0 p% l% R. c
}
# Y B9 k+ {' |9 I6 a/ P
$ d9 |/ o5 V4 O' \0 N9 y3 T/ E- k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* t' h" U3 |* ?
% l5 B+ p$ I m! g
while(1)
9 d! L1 u: j2 C5 e/ ~& T
{
" d" T. `4 @2 P z: q& U D
read_MSG_buffer(mem);
5 U6 w& F g" J
}
0 w6 |: I+ p6 ]7 e- ?0 }
}
; ^% O7 e# j4 P2 f' K1 ]" W
! f' C' o2 E/ |$ }& a6 C
void read_MSG_buffer(int *baseaddr)
G9 m7 t0 E. Q- {1 r1 P
{
+ O' ?6 M) P+ Y% S' h- N
pRX_MSG_PROTOCOL pshreRAM = NULL;
. w$ b( l: [% ]1 p3 \7 Q
7 Y3 r3 ]9 `3 V- G5 I7 G/ ]
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 L& \" p( N; }2 [0 v; H- x
. ]& L0 T) Q8 \4 [/ y
if(pshreRAM->packet_cout != count_copy)
. T, c+ l5 z; \1 y2 ~
{
{, w' Z' V# ~4 _( Y7 o- v
printf("a is %d\n", pshreRAM->a);
8 ^, w0 b! ~% Q) `9 g
printf("b is %d\n", pshreRAM->b);
& O# O5 F6 C" Y* v, }
printf("count is %d\n", pshreRAM->packet_cout);
" A% K+ _2 c" X% H& g2 N7 f5 E
count_copy = pshreRAM->packet_cout;
5 ?0 r5 q& ]1 V: r1 n
}
4 l* u$ q; @7 k, `
else
+ \; G0 m: R G- K
{
( q- K. y1 n: K, N$ \
printf("No effective message!\n");
5 T4 @+ N# z2 `+ X; \4 d
}
) j% I5 N7 Z1 e8 v, m
}
4 S5 h# W5 h9 N
) {$ S+ [; u1 z! p2 s6 g! O
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 t( \% q2 `7 c$ H
- R* w6 ^: G4 r
9 o3 V7 p9 O# P3 ]9 w
& m8 s( `! T3 a
) _4 [: r1 b# ~' s3 `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4