嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- D }+ U/ J/ p
9 K! _( ?. O% M7 b f5 C; C# U7 l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
j! h' I5 B& m, e% o' d+ G) a
#include <unistd.h>
7 ?, ]6 Z: M7 ^7 o
#include <sys/mman.h>
1 V- i. f4 ^ D
#include <sys/types.h>
) C" o: d6 R, v& h/ z: ?- S! P L6 ~
#include <fcntl.h>
2 @& h# Y& x k4 s9 U7 f
% Y5 z! h, j1 U" l- e$ Y" |$ {; L
#define SHAER_RAM_BASE_ADDR (0x80000000)
l; i/ }" L' |1 v- M( {' M
4 R& N+ Z0 L0 f4 A9 y
typedef struct
4 p5 M7 M5 H: h" l6 s
{
4 n+ w$ h* C0 I
unsigned int a;
# t: ?; B; t4 X* ]$ R
unsigned int b;
& h o9 j( L ?/ p! v8 G5 ]
unsigned int packet_cout;
- Q, |1 u7 h- n" b, l0 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 g5 L$ Q7 V- J7 J
. K2 Z6 {" b/ n+ |% w8 J! |
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* w, X0 c0 ?2 y
unsigned int count_copy = 0;
: L1 C" ?) A( u% M1 q
6 Z7 Q/ k4 @) n: }& _
; e. ~7 y4 Q" i' D$ A6 v' _, E" ~
int main()
2 A; i6 [+ s! g9 c; f# d
{
6 a* g6 y# I. J# @/ H" H: T b
pRX_MSG_PROTOCOL pshreRAM = NULL;
& b- c- ~" K7 c+ V* ]" y) X
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) D, k; B' d) U; U0 a9 K! y
) R% p3 p' e c: \3 X' c
while(1)
1 R e' _: |6 b0 J& s. P8 V' p. u
{
! T, J5 q! L" L6 |7 w) v* j
read_MSG_buffer(pshreRAM);
- u& z" U0 Q! w* r- [
}
+ X5 u4 A( g0 x
}
9 o \8 q1 W: k1 L; M+ N
* I; ~4 R2 k* S" ^6 r$ F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 `& x: G- \ x9 q
{
7 S h, U1 ~" W$ e$ ^& J, i2 @
RX_MSG_PROTOCOL buf;
3 |# X7 \1 ~. q+ _5 o, X3 w5 P
" f) q' s& }# D; T. [, s; c) \9 ]
buf.a = pshreRAM->a;
. ?: T: _% T: c& d( m
buf.b = pshreRAM->b;
% ?# u, D- }+ R
buf.packet_cout = pshreRAM->packet_cout;
8 R* @7 V' U- s" R. j
! J/ s/ i7 O4 _' P
if(buf.packet_cout != count_copy)
. x6 |2 y( t) G2 h9 H5 B
{
0 ?5 W# ^' S- B+ p$ h
printf("a is %d\n", buf.a);
2 Q0 `$ s4 U, ^
printf("b is %d\n", buf.b);
' V% e* c9 W9 r. r5 X$ t
printf("count is %d\n", buf.packet_cout);
( ^. `5 K/ U1 W0 f0 }3 H- H
count_copy = buf.packet_cout;
- `; l$ _( R) X5 m: W6 j! C, \& V
}
3 `( _& Q/ w$ Z1 E: V
else
) q* p8 P# v5 e1 V7 `
{
) R- @" f. J1 Q1 L5 z
printf("No effective message!");
# c3 x1 E- D i6 H
}
1 W' ^9 a* k8 p1 |- \4 I! F0 R, s3 j' ]
}
- f3 F9 Q& c T: F
* M- w! _* a$ [1 L
/ W9 e2 O/ o2 ]$ R7 h) _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ~& k! n; y$ e" u; J* m7 B
使用下面代码,对内存使用了mmap函数后:
) |- z, k9 ]% T4 T& h+ Q& S) t
#include <stdio.h>
' E) _! }( H8 l5 r# I6 e- i
#include <unistd.h>
0 J; w" r* O9 t. I A! Y8 j
#include <sys/mman.h>
( [! F8 e) r9 m( M
#include <sys/types.h>
- P3 i4 F6 k8 E- c
#include <fcntl.h>
6 V1 y6 f; y" _+ s
& [- S5 T$ a. |& w* d
#define SHAER_RAM_BASE_ADDR (0x80000000)
' w7 c' s% i6 u7 I
#define SHAER_RAM_SIZE (0x20000)
6 r: O6 {2 j# d/ R U/ U0 R# C
0 I7 j8 c- A+ }9 v" N2 C. y
typedef struct
+ Y' I' x. v. A0 Z( x
{
% T" _" A+ |- q
unsigned int a;
1 ]+ X7 `$ s5 P, N
unsigned int b;
' R( M* v) G* @! N8 G
unsigned int packet_cout;
. o8 {. @- T9 y$ h2 j" @& K0 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( F& z, M& r, Q) K( M
- T) ]/ \+ p2 ^, A. b
void read_MSG_buffer(int *baseaddr);
& [, d# `7 b0 z) n- E
unsigned int count_copy = 0;
1 `* K$ O3 T6 }1 b
, O5 e! {- W: u! Q7 q+ H
int main()
* [% X1 g m% e3 C& k1 A
{
; b) A; K' Z8 t7 U' y! N
int fd;
?! |. j- v2 Y6 r: }3 ?! `% s+ S7 A: L
int *mem = NULL;
0 G' J& W) W: s) d( V8 ]6 Y
. Q: b0 a2 `* W/ ]' [
if((fd = open("/dev/mem", O_RDWR)) <0)
6 O( {6 s5 ?9 v
{
6 d1 P3 ?5 t5 {4 Z% u& i+ C6 }0 ^0 r, ?
perror("open error");
6 y) ?/ E+ M( ]* C
return -1;
7 m. w9 c0 Z& c" P w4 Q
}
& R% K& F3 @( S. q6 C2 Y/ ?
& A1 e( K4 i# S0 w1 n
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 m2 P! ^6 l! J9 @0 Q" N
; k6 G2 N, Z. `
while(1)
- }' s1 _% n) j X; G
{
& w3 F1 v# B, x9 F: [* a# {+ R/ N
read_MSG_buffer(mem);
3 b( U. F2 E9 ]2 {2 Q4 Q
}
4 N( R: O* K6 r; F
}
$ ?$ q+ W. e& [; u6 ]2 \5 {
9 B! {7 }$ p I& _, H4 o; D9 k- T& Z
void read_MSG_buffer(int *baseaddr)
9 h# w' n1 _$ E$ a. z8 C# X
{
; c0 ~8 B, v& y! d* u
pRX_MSG_PROTOCOL pshreRAM = NULL;
& Q$ _. `4 d- ~
3 w7 Q2 c! y: S4 f& R1 L( v
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! L/ s! I' u& e- X" B, Y0 J
$ G% a: Y5 |% K' ^- P
if(pshreRAM->packet_cout != count_copy)
4 W8 F; G }, T- R; A4 {2 B
{
: m7 R+ }6 W" @7 t, U6 L. B
printf("a is %d\n", pshreRAM->a);
7 i0 _( Y2 G3 K" U( C9 m2 I5 u7 G
printf("b is %d\n", pshreRAM->b);
% M% ?1 Z* u) @ J- d
printf("count is %d\n", pshreRAM->packet_cout);
6 M$ L) m* [3 m. A, j5 N9 _+ Z
count_copy = pshreRAM->packet_cout;
3 N2 w- v4 A9 b X# z5 j
}
6 s, z9 r) k" m% U# I! P. ^! p
else
" F; T4 l. d g1 s7 c
{
; H& d- I3 W" ?0 b7 E5 X5 N3 o
printf("No effective message!\n");
7 m3 P" a2 X# i9 i
}
. ]& h( V: S* w ^6 `6 H
}
* p3 L" f6 [/ f& J. ]- {& j1 G
# A3 C% n. @! G7 H' M
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) K! X! h9 z9 ]
2 u2 ~1 [6 I& I, s$ j8 V
, g# Z5 B# c: ^
: C- z% L# p+ k
8 B3 b/ D5 ]) S' w: O6 f9 i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4