嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" Z1 l1 B2 q& R j) i4 M7 N4 [: c$ Y
- Y: E* w1 q1 U. U" p) k7 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* p( f. N1 V/ S' C4 s
#include <unistd.h>
- p$ h4 |/ F% k1 P7 w$ g; D% F
#include <sys/mman.h>
/ ?5 ~/ g( l$ q. p) M+ B
#include <sys/types.h>
: r3 b4 q% n/ Y
#include <fcntl.h>
* V4 L. z" Y) D
, j) F; J9 u6 h( \7 W* J
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 k0 o" e, @5 E6 |& B1 J& r8 x
& N3 g- s4 ?* A3 j6 R1 U: q3 x
typedef struct
8 i# D. q! K3 f% J
{
" Q4 S+ u& l* c0 Q" G
unsigned int a;
( Z/ @# I- g2 x- z8 Y
unsigned int b;
* m; p; T7 L: H: `
unsigned int packet_cout;
& `4 z4 I4 ~+ |; ?! R0 x! |! ]
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! o6 G* f$ w( g/ ]5 O6 Q
5 }0 M, c% X8 B/ n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- u0 `6 x& |2 G9 U; }
unsigned int count_copy = 0;
# S; {/ k/ {! X9 T
4 @5 A3 \( E) F' l
& c, l% m4 w0 h' d& E( I
int main()
+ r# j& k; }- S. F
{
, a" N& |$ C5 t6 P0 c
pRX_MSG_PROTOCOL pshreRAM = NULL;
' q0 g! `' P; }" L- _# {* ^0 A# U
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" p9 X2 ^( ~; P* v2 D, A& o
! M1 x% Q7 z8 P; O0 Z* H( e
while(1)
) _# t I8 l/ Q& a8 m$ Q2 H* c
{
1 j, ~8 w9 V8 o* X
read_MSG_buffer(pshreRAM);
4 ^7 d4 V! D6 V) M1 _) z
}
9 e0 x7 ~, J: ]* x& n. T
}
3 K: x: r1 Q# x
K5 s' l9 e+ S) @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 z: o8 ]. ?' y. e5 i
{
2 }7 g: w4 K( G
RX_MSG_PROTOCOL buf;
; i" K7 K$ \" ~5 |0 l8 V
* p: f& e0 O. ?
buf.a = pshreRAM->a;
& p3 K P# P( ^4 x& g. J( h3 N
buf.b = pshreRAM->b;
9 ?! ^9 V0 l( m$ S8 l
buf.packet_cout = pshreRAM->packet_cout;
- Y) w. ]. P/ v* {0 v
0 G7 A' h/ t; I3 C) H# X. x
if(buf.packet_cout != count_copy)
1 ^4 q7 m- K5 V& O, \3 p
{
' J' y. Z" F) M* {4 r1 q( L' n9 i9 Q
printf("a is %d\n", buf.a);
8 d7 _- K" ` j3 e. P" P: `
printf("b is %d\n", buf.b);
; Z+ c) P3 `- o' g, P4 A) Z
printf("count is %d\n", buf.packet_cout);
, k& d* I0 ], B+ p: n: y) l
count_copy = buf.packet_cout;
0 C8 y0 B5 R; ^# f; @' ~
}
3 R# b6 I1 j5 p( [8 k
else
- N8 }+ Y4 D; ? b$ j c
{
* H, c \4 `! Z2 Z
printf("No effective message!");
7 A+ |( v& U. s# R
}
( v" c6 F& b2 z2 m0 ^
}
: a ~% @, t, T z. M8 V/ A' W
5 G2 V7 z1 s( O8 V/ j
6 n, X5 N9 f/ w
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 W U; Q' x* w9 i
使用下面代码,对内存使用了mmap函数后:
, H0 `8 f: ?. a; {
#include <stdio.h>
! A6 Z$ t. u; ^7 j& c5 }
#include <unistd.h>
8 w/ E+ x4 Q3 b+ l$ P
#include <sys/mman.h>
% x: S' }! k0 g2 E& X
#include <sys/types.h>
! a4 L; K5 I* d. [/ h- b% b
#include <fcntl.h>
/ C# q; h) E: ~# L2 K# }
/ g; N5 T8 e( _
#define SHAER_RAM_BASE_ADDR (0x80000000)
# e4 R: t t% c" d# H: q9 J6 t
#define SHAER_RAM_SIZE (0x20000)
- \2 B y+ C7 H3 P( D) o7 m3 M
; a. {/ L( V5 g$ K4 _; g' b" B: W
typedef struct
6 ^7 B. \5 c1 |8 h7 p) g
{
$ z) p; }$ i- I) o( @- U
unsigned int a;
' O+ s1 T; N. C5 `: ?1 P# j( t
unsigned int b;
: c0 u$ _8 p3 N
unsigned int packet_cout;
. q7 `/ ]" r+ k# W
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& s. |$ A5 A- A+ n. P* f5 @
$ \6 u1 \6 B) i5 C& `7 t' S0 h# b+ a
void read_MSG_buffer(int *baseaddr);
5 I6 e+ g! q$ n; k+ F, @
unsigned int count_copy = 0;
! z: M6 [& [/ {! Q
! a a. x. \. c
int main()
; @, l. G4 @$ p9 L- ~0 [
{
6 W/ G0 N0 i8 S9 l" y! U
int fd;
- k+ v' V2 d$ F6 S1 ^' K) \8 v
int *mem = NULL;
1 a! F7 ?1 o0 H) b
! Y K4 P$ O6 z2 Z/ l8 A" p
if((fd = open("/dev/mem", O_RDWR)) <0)
% q. Y6 Z8 T: }9 w" h4 b+ ~. n
{
, |" ~2 N$ J1 p2 u" ~" T$ W
perror("open error");
% Y/ r" p- N. [( H
return -1;
/ d3 g# J# i$ u. [
}
0 {2 u# ?7 y! m) ?+ T
8 p4 M5 N) v, Q* d: F# t
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" [6 `% t6 R: E8 D" a7 {9 `
( z8 S- M# w V& Y) x/ Q5 k
while(1)
( I# g; U4 |# k) T( w7 C
{
& R( t6 o* B7 b1 z. O5 {& |6 W
read_MSG_buffer(mem);
+ ?0 P9 [1 T% J$ t0 @" ?1 n
}
) t3 w9 a9 ]4 |0 N3 @7 b# w/ k( i
}
( I7 T, `8 D6 n V2 u
4 L" P, m+ n$ s; @: t) P
void read_MSG_buffer(int *baseaddr)
; T" a! f. r( [
{
~% ]* r% v6 x9 x
pRX_MSG_PROTOCOL pshreRAM = NULL;
& g- I3 @$ W! T
! M- r, q: ~, t- b% ~
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. Y; |* A6 p4 z n' `# u) \
. k% s3 ~: P' y3 S9 G
if(pshreRAM->packet_cout != count_copy)
H/ `+ {. j2 T' t+ P/ E; d
{
9 P# l. r$ u, }. ^8 D1 A
printf("a is %d\n", pshreRAM->a);
$ s% v8 ]9 T% d) q( h1 M M B& \
printf("b is %d\n", pshreRAM->b);
: L8 j U7 X9 m! }. i
printf("count is %d\n", pshreRAM->packet_cout);
& t5 H3 L5 V% l+ C9 v7 E# {
count_copy = pshreRAM->packet_cout;
; o9 n) L& n0 |! Y5 i O) R
}
/ K: |4 b2 I5 T9 g* }5 \# z
else
0 l1 r5 s9 W& r# N" M
{
1 `2 e' G3 p& |1 j j; e+ P$ Y
printf("No effective message!\n");
) K* B+ b- r- E) n: S* I9 { K. f
}
4 ^3 ^. a$ d/ N6 X; C, f2 ~2 S- B8 P9 H
}
) |6 b9 C2 F1 W9 n2 r$ N6 `* e
% c6 [/ }0 D0 L7 ` a3 J
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; G% l5 H# Y& e
: g* j# ]2 g5 Z
( I8 T' v7 }5 E2 I: L7 u7 a
5 F! W7 K4 u% i
5 o' _4 ~1 I: k# ]
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4