嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
9 ^* C2 s) D q7 y @. P
/ m- ?1 Q V7 R* p$ u* u& G/ i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 R( z2 b* W+ Z# Z/ |5 l, e6 W
#include <unistd.h>
4 l0 H f0 Y% y( S
#include <sys/mman.h>
9 i. ^: G( o* B/ {: {
#include <sys/types.h>
) F8 l& V% u* l+ m# `) K+ I* j' D' h
#include <fcntl.h>
/ V& w- l6 ?/ d" G9 ?' x
+ j$ L/ z" Q+ C+ B8 V Z/ B, z
#define SHAER_RAM_BASE_ADDR (0x80000000)
' I) T$ p% N5 @. W
e& h. s( h2 d: {) c' @7 f
typedef struct
1 G1 [, K' u/ P6 h; [% a2 s" |
{
: @2 H5 G# P: L9 L0 O
unsigned int a;
. U1 h0 W3 G; B8 v0 l) z, h
unsigned int b;
1 S {0 X% f) t+ p0 z2 {
unsigned int packet_cout;
, V& m. s$ V! \ o" e# O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 f* \4 Q) I- l. S$ N1 [5 z* P
# D$ K6 f* ?" O$ ?$ e* Y$ s) Y, I: r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# L' X. \1 k! J* v
unsigned int count_copy = 0;
; y+ @, _+ }2 T
+ S# `2 t" f) r2 G5 K- v
$ h( u* B; i0 Z* M
int main()
8 H: m6 D8 S- j/ Y( Y& W2 ^
{
6 _. o& F% ]( C, D) R. D
pRX_MSG_PROTOCOL pshreRAM = NULL;
" L' e- Q" _) m! r! O9 N
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ _2 p& K. { Q# ]" u
, [# i4 ~5 x, n$ H
while(1)
7 o6 ]' e* g3 |2 K
{
' D0 F( X, B8 d) z5 Z' b: y6 T( U7 q
read_MSG_buffer(pshreRAM);
' ^2 y! E9 d8 a9 W1 n- s. d
}
, s$ } V" V. i) i
}
2 j5 W2 F' b4 J! L U
6 O5 a N& |" [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( w- f' `; G9 H! w% e( v: j
{
; G, J8 K9 d/ M$ N; L g7 l
RX_MSG_PROTOCOL buf;
/ R2 M' L! _8 M3 _+ l4 x5 {7 v2 ~7 ~
5 S7 q; l; `/ ?6 J. @
buf.a = pshreRAM->a;
% e2 O! M- V+ F3 R
buf.b = pshreRAM->b;
" @1 _5 p$ s- z6 w# ~/ `& w
buf.packet_cout = pshreRAM->packet_cout;
" `+ J. d! j. W& c3 N
( }/ {6 x8 e7 u' f
if(buf.packet_cout != count_copy)
& w7 j# ?! g. _6 i+ U5 H
{
. T0 y7 c" P0 N! Q
printf("a is %d\n", buf.a);
5 u5 G5 }# C/ f; a2 h
printf("b is %d\n", buf.b);
2 K- ?+ B# j* t. ^' p
printf("count is %d\n", buf.packet_cout);
7 I6 |' }) h$ }% @+ X
count_copy = buf.packet_cout;
$ w( U5 ]3 c$ q0 \3 D2 a
}
! s. X6 O; p7 _- j' j
else
+ g9 V9 ?. ~& P9 o9 j
{
+ O: N+ ~: i* d' f0 g6 L
printf("No effective message!");
7 a/ r; p S; u! w' c; I
}
' f7 D. A) m# A
}
( ?8 p1 \6 J; g4 `0 c$ i* Q: T* M
7 _# A& i2 L. S/ e
0 F6 \* }' o* V2 Z; |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 i+ ], n6 P4 K O, p/ n* k
使用下面代码,对内存使用了mmap函数后:
' Z! X8 |1 l( E2 F: l
#include <stdio.h>
$ ^- s: B b. t5 z' {; O( e
#include <unistd.h>
" a/ O0 g/ ~! v9 L9 L) b* l
#include <sys/mman.h>
4 \, S# Y6 m6 Q# b1 r6 _5 R
#include <sys/types.h>
: }* O3 a9 Z! h* Q, S* ~
#include <fcntl.h>
% g) Y) ?: _# r2 F: x( A0 j
: Y$ r6 ~. f8 @8 D. A3 h
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 {& ~" }8 [# ?1 `' [& e
#define SHAER_RAM_SIZE (0x20000)
9 W* t, y) P! q: w, L% Q8 T
$ F2 _# w/ E5 K1 H) L) ?9 P6 r
typedef struct
6 o0 }3 y9 E/ W! L0 P
{
0 c' D, p7 Z& |" W5 _
unsigned int a;
- O, R' V/ S$ a& @& e
unsigned int b;
# d1 p: Y0 ~+ a7 _7 w" @ ?
unsigned int packet_cout;
* ]1 I4 d6 p, k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: k9 v) V# F+ I0 V7 ]
- b& m- E, X' ]! o* Y+ o; q8 T0 s
void read_MSG_buffer(int *baseaddr);
9 R: r% a' N/ n0 \% ~7 g; S
unsigned int count_copy = 0;
6 ~: z7 F! _( }+ e
( S. f! `& X" Y' c4 k
int main()
( Q; o; @0 C* ]* G! g* K
{
- i6 b2 U+ y* H1 c
int fd;
# m' }! D; N% c _- l) f; {
int *mem = NULL;
8 P* c0 P/ d) z3 @5 {9 T6 j$ k
. u6 r5 i1 w0 _
if((fd = open("/dev/mem", O_RDWR)) <0)
$ X" t1 b$ `8 C5 X$ h7 x8 |
{
& Y7 O; v" u2 U0 \8 X9 o r( z0 s/ r
perror("open error");
& }8 @) _5 V6 W, u
return -1;
* ^$ M9 O$ S; C1 }1 l
}
: ]* [5 P7 A# e$ g2 l
1 d" W \ h) B4 x0 M/ l9 I
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' \0 N/ O0 X6 K
2 |0 e8 U8 o) ]$ C( d+ ^* u
while(1)
, g4 r6 ^4 p8 ]9 g
{
1 W# c" J' g- n' a% e8 F3 V8 q6 g
read_MSG_buffer(mem);
) X. ]7 {+ a5 W+ ~
}
* m1 E4 b9 w4 }
}
- e( Q4 Y0 |) L$ D& @& H
! \9 t$ G/ }/ W- D
void read_MSG_buffer(int *baseaddr)
: v8 f9 z2 N# o; F* [6 D
{
- E0 U7 n& D+ z% e7 N( F
pRX_MSG_PROTOCOL pshreRAM = NULL;
p' b* J! a! a. l! y; w% w2 _
5 B% @% }' P" {2 ?' J, [' G2 M
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" ?( J d: r% }
2 d0 P6 S" Q: G/ R; o x
if(pshreRAM->packet_cout != count_copy)
0 n( t8 k! P/ E9 s @" [
{
8 R+ Q2 L" I% e X- i) J; e
printf("a is %d\n", pshreRAM->a);
2 e6 R% C6 D. J& e. A/ y* h# L
printf("b is %d\n", pshreRAM->b);
: t/ D! n0 ]5 b- Z& \+ c1 _7 N
printf("count is %d\n", pshreRAM->packet_cout);
! q( E: Q3 \: w) y `3 x) `
count_copy = pshreRAM->packet_cout;
, L' h6 \) F& L8 j j- ]
}
# |4 e( Q, W2 |) u
else
, Q( K+ d& M5 ]! U5 k
{
9 i) Y) F2 `- H7 y
printf("No effective message!\n");
3 Q- J" r2 \, `( |* a0 e& \# X0 C
}
' O- X* w3 q, y+ e
}
* Y+ G$ h7 F ?5 O. G. x% I W* z
9 |0 }" P2 E9 K' D$ l5 \! R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ K+ G3 u, [, q! K- o
: O6 C( w y1 q/ ~& i& W) J
* U" e( G- Z* I% X) c: i
$ g l, ]" a$ P; ?( {1 _
O- g! l1 t" P3 n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4