嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: m8 A9 {$ o i2 _6 ?! Q5 w# B
6 m1 q3 [: C* N8 H' @4 [: K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: d- h. ^. U+ H7 ?# Y
#include <unistd.h>
0 f; P, C6 p. V7 t( _" d) n" O" R
#include <sys/mman.h>
# Q; s& Y; Z0 Y5 v
#include <sys/types.h>
: I4 P# R4 }. [! y. a$ [- A
#include <fcntl.h>
* \6 t/ S6 y( A4 c6 A+ F$ }8 O
4 r2 {( v1 l; i# R t- r
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 N, S- V" t6 ]5 {9 s
3 p* l, p, |% r
typedef struct
1 `* a8 h) o8 q! c1 R+ x4 k
{
5 ~# t1 X T* ?" K
unsigned int a;
8 ~# W* `# }1 }1 z5 S
unsigned int b;
% J5 M+ I) P4 f
unsigned int packet_cout;
3 g2 ]* S6 u, F7 T' M( t" C
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
B5 ~* n8 c: S$ }7 I2 Q/ J
0 {; N1 X# W: @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( f p5 }3 M, v( O
unsigned int count_copy = 0;
) e( {& T9 U& {6 H2 \7 u
+ c1 e/ C* @( x* I- f: J
# w- b* z3 I$ S' |8 E& [/ i
int main()
% y3 \! j: ]% I0 i
{
" P m! M$ |/ n. w2 d' q
pRX_MSG_PROTOCOL pshreRAM = NULL;
+ m4 |- y+ r) c6 k7 @ q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 L/ g; T* P' R% E; I/ V
# |. Y1 F3 g- z5 u
while(1)
$ W+ c9 N" {0 Z# V+ X: i4 z" H
{
" G; G' k) E, ?) ?- G
read_MSG_buffer(pshreRAM);
' N) H$ z( X, o( T. p
}
: f$ c( `; `2 \0 S5 e
}
0 q& E6 u) n, x! W
1 x2 [$ |- M# f& J2 b- Z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 Z0 G! A- D7 L7 S' Y
{
- z+ p+ w' x, u% Y/ h! }3 i6 w3 T) i
RX_MSG_PROTOCOL buf;
' N: b, F) C& u" r1 T
_, D/ q' i0 j1 M7 A
buf.a = pshreRAM->a;
- i; t9 f; H1 F% p5 Z9 [9 }
buf.b = pshreRAM->b;
, U1 g& Q% b: R; j
buf.packet_cout = pshreRAM->packet_cout;
) @( M, Q3 u j" [
s7 u, q# z, T
if(buf.packet_cout != count_copy)
& b1 I3 h! v3 H/ U. f1 y
{
/ n2 ^; {$ k. R1 ]$ ?* w8 P5 }
printf("a is %d\n", buf.a);
/ [. e' |4 p# @9 {0 o5 j6 X9 ^
printf("b is %d\n", buf.b);
, y3 J" H9 R2 e3 a8 E, U8 e2 t$ |# g0 V
printf("count is %d\n", buf.packet_cout);
0 P" _6 ]( A+ x* s# y5 O, e
count_copy = buf.packet_cout;
6 u7 X @* E1 e
}
* L Y/ D. j+ [8 Y3 F' D( l
else
5 V4 u& R! \. m- Q' v
{
# ~2 [ [: u: x# h7 V8 E
printf("No effective message!");
7 r E$ I4 c1 {9 d
}
, c/ t% |, V9 _. L( g0 l
}
" K: X6 h8 h. _8 q* l& G$ a/ @( U
- T* z4 D- Y- [9 y8 x
# `. U4 k6 E+ g7 y3 A1 \, ~8 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 W; a# S( s3 U# W
使用下面代码,对内存使用了mmap函数后:
w5 v& v) \1 v
#include <stdio.h>
u$ k |, O2 i1 W
#include <unistd.h>
/ k2 b- _4 u( U7 J/ Q4 _% l4 \, l
#include <sys/mman.h>
3 l' a. }& k# ?. q8 W7 p4 W0 c: i
#include <sys/types.h>
2 |: B9 Z4 K2 a6 z" V$ o' Z8 a
#include <fcntl.h>
9 x/ A0 o+ g* y5 w# g0 T- b* Q
& q& A9 ?* T* d/ ^+ Q0 _6 T7 D
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 ]0 }7 f1 p9 {& t) c
#define SHAER_RAM_SIZE (0x20000)
# l- N5 e5 H. Z a$ O# r
4 j. _8 E- j1 D8 C# @; O
typedef struct
& W. M8 I3 H7 B% N/ z9 F8 A
{
8 F6 [' g9 R% T5 o* r ?! x
unsigned int a;
! H7 s- \. q( s( f3 d$ g) C% z7 w8 {
unsigned int b;
' {9 ~$ B" n& F- N" ]$ U; }4 i/ a
unsigned int packet_cout;
; Y/ J1 X8 n2 p) g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 N4 ~$ h9 @" t$ v
& `7 ]- N7 L6 ^5 S3 A! V
void read_MSG_buffer(int *baseaddr);
4 ~7 ~0 I/ z$ o }$ M1 Y, d/ ?9 S) F# a
unsigned int count_copy = 0;
$ N3 n8 `% _9 z, ^2 C/ h* q
! E% D) S4 W# O0 \7 `
int main()
' v5 i: ?) j6 B+ i5 Y% [
{
5 b x( q, k0 \/ E. K3 B1 s M
int fd;
7 G4 x$ K3 }$ R# J
int *mem = NULL;
: Z" {: _$ ^1 [* w
6 V2 ^; L9 g$ y% j
if((fd = open("/dev/mem", O_RDWR)) <0)
8 X, R3 m5 S/ q4 M$ w& y
{
7 l3 l' ~- I) I6 b4 M1 v' C
perror("open error");
5 i' U8 o; L! \9 k4 D E& |- O) s
return -1;
8 \+ c* K. ~3 v% ?0 `
}
: p( X3 e8 U' C3 O; E* y4 B
4 ~# h- S1 v. L% Q* ]1 _
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; G3 \# r# i4 W" A
0 ]. n; D. A) B1 U4 h0 V1 B2 J$ R/ e
while(1)
$ Y( Q7 w" W; N+ F
{
% w/ U/ }2 H( L$ c/ W5 U' d
read_MSG_buffer(mem);
: z/ T# s( }1 d& C
}
. _! ]1 [% P8 J/ @( J2 M+ u9 n
}
2 o2 _/ h3 v @. c
3 Q5 \3 w8 o3 i% u T4 a
void read_MSG_buffer(int *baseaddr)
3 }! p! }! X% O; ~: v
{
$ q, @, v( s% B z. X5 {( _# d9 B
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 P5 y! i. |! y& x
2 I1 @- D" v! c$ B* [4 F8 a1 {1 i
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! _% ?1 w R M, S2 ?) w$ C
! f9 l6 @% f) R+ I" x& [
if(pshreRAM->packet_cout != count_copy)
0 W& ]1 A' G: J7 d% M( ]
{
/ ~# E/ J7 |' n- F6 j4 C+ J- h
printf("a is %d\n", pshreRAM->a);
! D" n7 a/ E$ P0 f$ |8 @( c) {/ x/ s7 H
printf("b is %d\n", pshreRAM->b);
5 y* ~; l/ f- v& d7 [2 A
printf("count is %d\n", pshreRAM->packet_cout);
1 z6 Y$ u( s( G+ m& W
count_copy = pshreRAM->packet_cout;
6 f( J! u; s2 X5 h9 P9 \
}
' U- O/ x9 g8 U( n# [
else
' w+ F. o) H; ^6 M, V/ N4 }
{
) N: W& l- E$ Z- c$ `6 \, }
printf("No effective message!\n");
i. D" O1 C6 t( u2 X% p
}
- W; H' h' }* P
}
( P7 a& n. d4 o$ z
& B1 t4 o! `- B6 B) k
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! M/ a6 z% t+ Z& ~# w0 d
* Y4 i0 Q6 b6 i0 |* j. |: q! a3 E/ u
8 I6 W) F; m+ E1 \
3 u$ r/ {# A0 g* {
: S( n3 O; k+ t: ]; V, Q% W: N6 v$ O
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4