嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# `( V. v- D8 g3 B; B d8 p
# k4 C/ P& @2 u) t0 e
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ ~& u0 J" }( s" [
#include <unistd.h>
3 J1 L7 K: ?0 h0 b8 W
#include <sys/mman.h>
' x# Q; h% t! w8 u6 L
#include <sys/types.h>
7 x. A _, k, C4 v E* o
#include <fcntl.h>
2 s/ }/ ~" k6 ~( H7 U7 H
$ B$ n9 `8 _9 x+ s$ |4 y1 B
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 k1 _; p l' \1 ?: V/ I
! z! d( t( Z+ W7 u4 T9 i
typedef struct
* F$ v' U x' N6 f* M) `6 p9 z
{
8 P0 E0 _( b& I1 [
unsigned int a;
/ s6 ]( w: R4 {$ W/ N% C3 h% y+ V' S v
unsigned int b;
3 B; r+ b. D3 {# a. ^# h
unsigned int packet_cout;
$ J! u9 t$ W" {) q- s1 H% k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" ], @9 D+ Z7 v& y7 N
# p' ~8 w* \4 e9 U3 P/ e+ ]( {
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 B$ n4 O+ P1 ?2 e6 h& `+ E% v2 c
unsigned int count_copy = 0;
2 Z, d% N% R9 o% l2 G( V! s
- _8 U! U6 E' N2 ~, }6 A1 _0 w
# B1 U. b8 i R# a
int main()
$ ?8 P$ b2 Z3 q5 R8 i
{
* O& V# e7 i( x, G1 H$ q+ i! N
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ q- {* c/ w7 ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: K8 R( I" P- Y+ @! k
. @* a8 ?$ P- _* E4 I4 D$ e
while(1)
' @. `: k- _+ Y+ h2 V
{
0 ]% j7 X1 e5 b7 r$ E
read_MSG_buffer(pshreRAM);
: |) w) R" e2 l# `3 X2 z
}
( e6 F+ D6 ]. e4 F4 K
}
/ h. ^2 o$ j Y4 ? y$ c1 A u
3 U6 a1 L% f8 g1 p: r0 q6 v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 k! n- K( @; D% W) s& I
{
/ L1 N4 j$ H4 a& n5 c4 j1 D
RX_MSG_PROTOCOL buf;
5 J" J! v. {3 @% V
' L G% W/ ~) d, b: T
buf.a = pshreRAM->a;
O2 _! X( w4 s* L( |+ ^$ K
buf.b = pshreRAM->b;
, _7 v G S6 v. R, A5 @
buf.packet_cout = pshreRAM->packet_cout;
/ h5 \& E5 E5 j! H) w6 L
6 I9 ^1 b: }- H
if(buf.packet_cout != count_copy)
7 W6 w/ b; X3 | a2 z
{
$ j4 x5 v. j/ v4 u
printf("a is %d\n", buf.a);
- j( [, w+ P/ F& [8 u
printf("b is %d\n", buf.b);
+ Y. ~) b" f! J4 {6 t. p) I: v
printf("count is %d\n", buf.packet_cout);
T$ `3 K/ G* u' h! n) L [
count_copy = buf.packet_cout;
0 K9 L: B4 j* ~0 f( [8 C
}
6 o: U. s: Q- `. a% V7 l$ E/ c
else
, N7 H9 H! y; I. {" M
{
0 N/ W+ E/ @& j9 {5 A
printf("No effective message!");
& I2 S7 V4 [5 [1 S/ B2 E. h
}
) M6 X4 j% V: y+ s: w
}
_0 o( R3 g$ @! Q" v' P8 p) N# w
1 T) d1 D* t; e7 q" d8 S4 a
6 C# ~3 z( U) D9 u w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" |& h. \; _' M6 t0 c/ i
使用下面代码,对内存使用了mmap函数后:
( }4 R1 ~5 ^$ R! I( }
#include <stdio.h>
% y1 Y) H( x& E3 |
#include <unistd.h>
6 t' N. R" u5 `- @
#include <sys/mman.h>
w2 z8 s1 a$ ^+ B
#include <sys/types.h>
7 y8 y. { `7 r$ O. x% P) G
#include <fcntl.h>
7 H. d! l0 W5 E# q* B
7 {; r+ t z! B
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 b( m! l( a! G) r5 A/ a( `
#define SHAER_RAM_SIZE (0x20000)
$ g5 @3 d$ e: }) l# Y
& X8 G/ l Q! n( _
typedef struct
1 Z& m4 x' k. s2 C
{
- U6 W- q( C8 N& D2 D( ]
unsigned int a;
# z! j& B6 i& j% b; t6 W" [! K
unsigned int b;
9 U8 L' g# l: I6 S
unsigned int packet_cout;
( ]3 d; Q) j- Q! F. L3 k; q# n5 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. n* i* E2 v. x" m3 ^* _( n) `+ l
8 y, k4 J3 P' e* T) X8 N
void read_MSG_buffer(int *baseaddr);
8 \) @( S2 Z4 P1 |! J4 F
unsigned int count_copy = 0;
~+ t, M/ {8 Q. r. F
" a7 r( [& ?3 M+ p
int main()
0 Z$ k# ~" G; \
{
' s4 f. }4 R1 O
int fd;
" ~% u( D& ]0 y0 f5 x' h& f
int *mem = NULL;
5 [! ?& r8 U- u
/ s2 u4 ~8 G; Q7 ?7 n, T- Z
if((fd = open("/dev/mem", O_RDWR)) <0)
: X' H% e5 @9 L
{
$ y* w7 P5 B+ B* [
perror("open error");
& c7 K9 [! O8 \
return -1;
0 d% t0 e( U( @: ]0 S' r% a3 k3 X% z
}
; f8 g( a: g0 m4 M9 t. e0 w# k
- X, @6 j3 f8 g$ L- x) T
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. o' q P6 e# N' ~# Z. S
2 l8 Q3 ]; J: K' D- B0 O! |
while(1)
* s( O# F, |: v( s" |* c" b
{
0 h$ `' [) A0 D) `
read_MSG_buffer(mem);
" B" V% {8 m' s
}
! M1 g% ^. ~$ ` S' G @
}
8 k/ N: a- v& G2 {
6 Z# ~: a4 o' R9 ~
void read_MSG_buffer(int *baseaddr)
1 u& M$ r1 u" |+ Z; P
{
, `2 A. m' r( D- c2 n2 b
pRX_MSG_PROTOCOL pshreRAM = NULL;
% w* w0 g, p0 v7 h! b: z; ~
/ V2 E6 b* y9 r8 }) K
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) G4 s- K2 }1 L% o" d1 v# Y( e+ x: S( u
4 [ q, E7 c# N$ @0 F3 ]9 z& g7 k
if(pshreRAM->packet_cout != count_copy)
- L& H3 t* u; D" V3 [0 i" x
{
: F0 t% q4 a: m0 P, n$ f# I( C0 G4 B
printf("a is %d\n", pshreRAM->a);
\; T; A" O4 ?2 r
printf("b is %d\n", pshreRAM->b);
' |8 I+ B3 p/ f; h' a& a
printf("count is %d\n", pshreRAM->packet_cout);
! H( R. p q4 N# @% c
count_copy = pshreRAM->packet_cout;
; |8 `+ ]4 |8 d8 \+ n( r
}
2 a+ g9 J$ D0 o* J+ u4 T1 a* s0 ^
else
( e( A2 {0 Y- ^' r$ K; Z9 ?
{
) f( x: K+ l5 d
printf("No effective message!\n");
3 ^6 D R6 k2 I6 O/ Q, X
}
7 |: f. F8 x2 y6 y- B. p# L7 X: o
}
3 j9 ` Y" q9 {
# [% ` Z8 I6 H$ P. u/ h D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 g* q* g# |' W4 q8 P
3 s3 a$ D: a4 {$ m8 P; ?, L
' W+ d0 R* e% H
- r1 B% B3 c, p% I' l
; ?' Q9 \6 a: f2 [% v9 n
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4