嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& s0 n; a5 p* Q
$ c. z: @9 ^6 e- @- n6 P/ k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( u# D5 v! b5 q
#include <unistd.h>
% T* e- s, h+ h4 j& [5 o0 H, y5 L
#include <sys/mman.h>
$ ~5 o9 P9 B/ W) F% Z; l. O) d/ l! @
#include <sys/types.h>
9 W3 ]: N$ j z- p0 k
#include <fcntl.h>
3 V" R7 R# n6 B. d2 ?/ H4 ^
% F0 r3 s0 t3 S7 D
#define SHAER_RAM_BASE_ADDR (0x80000000)
! y4 k* r% k% V. S% i1 F
. n5 C! F# N/ [. U+ J$ k
typedef struct
' v. c/ |3 L$ J3 X9 ?8 u
{
0 q) O6 I* [% |
unsigned int a;
; k6 a* w' v( j1 I
unsigned int b;
! @1 K6 A% c2 T) b5 l: k) r
unsigned int packet_cout;
& X1 Q4 O" F. l; E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 ^4 i" v! ^3 T# k+ \8 }$ k! v
9 r& J0 _( @2 O2 u8 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 m- u- \# O* {( T* Z
unsigned int count_copy = 0;
2 _. e( K& j8 ~. S; d4 c$ G: H
5 w) p/ L1 v, M! |5 b8 a
& H. W% K! G; l e7 h7 }4 `' g3 L
int main()
) u3 O. Q% n% E
{
L f) C% D+ B( N
pRX_MSG_PROTOCOL pshreRAM = NULL;
; w1 p7 E8 j9 d% B ]
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ M- o( r0 n( Y8 P9 V
9 B8 \. J9 @+ N' }+ x& i7 y$ i# X
while(1)
: P2 m9 E$ t. R
{
# \2 t- j- H: W# A+ k" c4 m# S) S. b
read_MSG_buffer(pshreRAM);
; K, c* U, k2 {* m2 ^; z, T
}
5 E" D/ @, S+ X8 s6 w
}
7 z+ a+ @1 ~5 G9 Y
2 ]( J. i3 ]5 D. f' T [1 G+ N5 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" W! G2 n% y* B, N; L6 ^7 f* e* i
{
! n9 n; C$ ?7 M! U9 ~+ c
RX_MSG_PROTOCOL buf;
& a/ h# v) P! Y5 a1 U2 B7 h. g
. p+ P6 D! _' b) G! R5 d, L Z# a
buf.a = pshreRAM->a;
" V/ P g( `: @. e$ j! H
buf.b = pshreRAM->b;
/ P6 I K" e* n) @3 f
buf.packet_cout = pshreRAM->packet_cout;
9 H) I# @* D1 E, n. M4 U
" D- ~: t/ m& o& p! W8 c8 ?
if(buf.packet_cout != count_copy)
2 k1 g8 _: p8 D$ ?$ Y+ E
{
' R9 P4 }1 F+ [" n9 K* V
printf("a is %d\n", buf.a);
; \6 [& x' \2 b
printf("b is %d\n", buf.b);
/ {: l# U& C& i/ z
printf("count is %d\n", buf.packet_cout);
, E0 \( W3 \1 ^( ?& G; [
count_copy = buf.packet_cout;
) ^. T9 U) }; k5 L4 L
}
- x! g8 l) x, [
else
2 j5 Z" ^$ x3 U z4 P9 r
{
8 v! l, S [: _5 N% H
printf("No effective message!");
* @$ g* y0 o* b1 K) O( u3 V7 \
}
8 z9 Z! H' I- \( p. V" |! A( Z7 I
}
/ H( N. k1 G6 ?# O0 |
5 N, ^& }8 ]% s. \- K3 W
3 m. Y9 G" f6 B9 J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 l0 R: k5 h7 K8 m5 h9 b
使用下面代码,对内存使用了mmap函数后:
! J& H3 X! M! [0 M4 {: _. Z
#include <stdio.h>
" C& w$ O1 N' s% m! I% k
#include <unistd.h>
- H+ d8 P5 L9 P" d7 n) V
#include <sys/mman.h>
- w- [; F# W3 p6 F! H
#include <sys/types.h>
' i: r( e8 Y7 p* R/ H) K
#include <fcntl.h>
" k& f& A) m* c5 F
, t) q& ?8 ?* f. S' U- x }7 x
#define SHAER_RAM_BASE_ADDR (0x80000000)
# |4 \: q. Z1 ^# j6 v1 U# c: [
#define SHAER_RAM_SIZE (0x20000)
: a9 d9 g0 e( W* K
0 E( B9 |! m5 O! P$ F- z
typedef struct
6 ~9 j6 Y+ C1 S
{
2 _, `) h2 s+ | `
unsigned int a;
. B, R1 @& N% U* _
unsigned int b;
8 R: v' l& Y% t( n5 _ }0 c
unsigned int packet_cout;
8 Z" Z9 X4 m; ?" n: M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! }7 T! O) E9 e5 y
7 g @) S% A9 l+ V; f* F
void read_MSG_buffer(int *baseaddr);
: |9 `$ r- V6 n9 u( ?
unsigned int count_copy = 0;
4 e( r3 Y+ ^6 C6 j/ G
, x% P8 F2 q8 C
int main()
' |; x' x ^% v$ ?- [& k8 `
{
9 j$ ]9 `7 n% \+ z/ a
int fd;
+ H& |: P) x6 u3 P5 a4 ^: d
int *mem = NULL;
( f- j0 M' E% ?) X
9 E4 O" s+ u9 f" m7 q
if((fd = open("/dev/mem", O_RDWR)) <0)
+ d" r: j4 ^# Q* b7 P
{
/ b; [6 F- ~5 l" Q; S% l9 l5 E; ~
perror("open error");
: K/ n$ V, d& m( H
return -1;
4 i$ V2 N4 R6 s9 {& q q; W% y
}
( |) b3 s, P$ j+ q" b5 x
& x: q; [# f! x* {2 I: l" v8 K( ~! }9 m
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, e. i# A) z# e
, ?) _1 q. x& [; h- L: Y5 }0 h
while(1)
2 J! x: U4 J2 d7 N# S u
{
, n' \4 q3 @$ [" f9 E( Z
read_MSG_buffer(mem);
. I! e0 c0 S+ l2 q/ X) p% o9 C: }
}
; @/ P* v7 U% q! X
}
) }( h$ Y3 u% \; \6 o
. e2 T* g% Q: l$ L0 @ W
void read_MSG_buffer(int *baseaddr)
' ~' P$ e: ]2 c5 ^ B1 o5 B
{
' w9 B; A) `' X4 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
" y! y8 Y4 B2 J7 ^* S. Y) F
U% x" Q$ I. t. F5 G7 S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 N: P; _1 Y8 A( Y
, _+ `& O8 a" J+ ~2 T7 D: Z0 y2 i
if(pshreRAM->packet_cout != count_copy)
- K- @) [9 `/ h4 o4 f
{
# {$ x: X) E. N
printf("a is %d\n", pshreRAM->a);
+ n' y( N1 P! [
printf("b is %d\n", pshreRAM->b);
& d- N; j& |" s; S4 Z B
printf("count is %d\n", pshreRAM->packet_cout);
+ {) ]# G% U" u& E0 x1 w, X
count_copy = pshreRAM->packet_cout;
3 H3 Q1 E6 ?) H& `4 z& J7 k
}
! g! g# D; o; L/ K% M8 H) l
else
; n4 J! \1 C+ a* z* T
{
$ \3 m0 U9 q6 a" \
printf("No effective message!\n");
& R& @$ ` |: T
}
% J V7 d: f; {$ L
}
) U4 v$ ]+ ?/ ]* r
1 o, e3 U5 |! U+ [3 a8 p) ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, V& B2 e; B; Q
8 x" p% d! |% R: v' n
* A" @3 {5 @+ i, s! |
- M& |3 x8 E' f7 Z: l! j
3 ~1 w% g/ \$ T7 P* U6 b
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4