嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- J* m- L( L# [+ E4 U% D
; u- x& c# ?( f( _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" O3 ~( I: r: V7 z
#include <unistd.h>
' L+ d0 G) Z' ?5 ^
#include <sys/mman.h>
. r. _0 E: ?2 g: C/ {' o8 L( y! V
#include <sys/types.h>
( P" W0 x2 d2 C3 `
#include <fcntl.h>
( }# c! G/ h: u, `& J1 ?! m
3 K4 f0 N, j5 q! b. q* [
#define SHAER_RAM_BASE_ADDR (0x80000000)
6 m7 c0 h' B1 X& r8 g5 ?, j
& q5 f, e. o+ V* Y+ X7 G
typedef struct
+ g0 Z& d6 ~* e
{
/ u+ m" b; E7 ]5 b. \6 U5 Z; k7 D
unsigned int a;
! _- e' x/ u- n+ O3 E+ l
unsigned int b;
( P4 ^. Z9 u8 j. ~! N' L
unsigned int packet_cout;
; G5 l6 t G8 x& \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 F% Q' r9 m2 ]5 o% Y
* S) m) t! u" K$ }4 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 W* E4 d4 E' m# A: B% q
unsigned int count_copy = 0;
( y! l' m3 a2 K) A& f e
+ E+ d1 ^$ p h" i, L
! y- ~0 {! ?8 `, V6 o' m
int main()
) H c8 v- _' c& I
{
+ M9 w- W4 [3 b& [: E( V
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 N/ k: [& s6 s
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% j T0 |1 N2 t7 y' |9 [
9 S0 }$ n* I! P% m
while(1)
[( [ V* z* S7 f; p" S
{
( Z# X% \' ~1 m8 m. j
read_MSG_buffer(pshreRAM);
, k$ N3 x- t) L! g0 K
}
+ W3 M/ {! K( q+ C9 R. G; s
}
1 J! Z+ R# E& h; B! R; h" |
2 j% g+ l# R. H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! P; K5 ?2 _5 T2 y4 J
{
2 Y$ c& n3 S ?9 V+ L4 N; H
RX_MSG_PROTOCOL buf;
: `* s3 H3 R* Y+ S
! _/ m; k8 s# t) l+ S
buf.a = pshreRAM->a;
0 Q, W' [! u9 r1 F
buf.b = pshreRAM->b;
3 r3 s5 R7 ^$ `1 q
buf.packet_cout = pshreRAM->packet_cout;
# H0 `# O# q/ P
% A; Q- i0 L3 k4 `" {
if(buf.packet_cout != count_copy)
5 z( I5 ?4 }* c9 F% u! ?
{
# H" b$ n0 g# U8 P
printf("a is %d\n", buf.a);
; E* d8 p7 r7 ~0 E- R9 u* P
printf("b is %d\n", buf.b);
# f, C8 [' {5 C0 j
printf("count is %d\n", buf.packet_cout);
% t4 P; o* E/ `' P7 p: {
count_copy = buf.packet_cout;
) k9 _/ h2 |2 J
}
% B- m4 K& G& j. O/ z+ y
else
' m' t6 C5 y% l$ W! C
{
. c# h6 d) J/ i' _2 X
printf("No effective message!");
: M. e4 [0 a( M# y! s
}
/ c, U1 x" {* P' M! o; M
}
+ y2 V- a! |4 H& l( F# ^
* y; _; [- k: A/ G J+ `1 M+ n5 F2 I
' ^2 `6 m( _1 K' j/ v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* p+ n. {4 X1 Q7 i+ i
使用下面代码,对内存使用了mmap函数后:
/ e! h0 L# E" R5 _8 C
#include <stdio.h>
9 I$ Q4 W9 n: N: e/ ~
#include <unistd.h>
) Y3 [0 v2 Y9 k6 l: ]
#include <sys/mman.h>
! I `6 z6 [, W$ ^( L H
#include <sys/types.h>
5 [& F7 ~( F) ]: t! i
#include <fcntl.h>
' M" R; {5 c! k' o( v& j
- O" }: m3 n! X3 X
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 Y b. h; ]; m, c2 @ M
#define SHAER_RAM_SIZE (0x20000)
" \( a e7 @4 V, _) g. b
: H- v4 t( m+ X
typedef struct
. _- B& n7 N Y. b& S4 a, e
{
; o/ R% M% ^/ g
unsigned int a;
+ u' t' d' b! S8 {; l) [" {
unsigned int b;
$ A0 x+ L o- ]
unsigned int packet_cout;
; U6 k9 {) \/ y0 i6 A( u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; D1 a: x5 ~8 `' ~; u* }: o
" Z* ^: ~1 h7 b& p; R. `
void read_MSG_buffer(int *baseaddr);
5 P% |1 }8 M5 F
unsigned int count_copy = 0;
$ L6 Z: u3 y5 h( |) D6 Y
$ s! H. Q0 @& Z. E! {
int main()
% v9 j5 n U/ l+ i! f& f
{
V3 ~5 v: D+ f) `; u8 q+ y
int fd;
# N+ \0 G1 p! ?$ k7 z0 Q* e: X$ Q
int *mem = NULL;
& Z+ O) Z0 z% ^ a2 c7 W& R
3 q6 k4 E* R- w: n
if((fd = open("/dev/mem", O_RDWR)) <0)
9 n& X$ R' `1 [4 F4 B" A; S
{
0 i& B# s# L% d
perror("open error");
& J2 f7 o) q2 O( f
return -1;
8 H( U7 @+ O/ o: ? Y: q) E
}
- ?+ J' I' o$ @- ~/ r2 f* ~9 g
/ }( u& u. [ f; F/ Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ C" G0 X4 [- J; m; p) e/ X% ~2 y
6 _ X: ~5 q: g# O6 i
while(1)
8 |$ u% V/ t0 }8 |
{
. e. O; |9 x9 O. d$ Y5 K+ x
read_MSG_buffer(mem);
7 d7 r7 K7 V9 H1 i) j& M
}
* ]! X/ _/ F/ t1 b# T- \; q; q/ u
}
# [5 \& [ w; _
: p; d9 [7 v& V
void read_MSG_buffer(int *baseaddr)
+ y6 A; F; s8 l8 q
{
3 H6 e/ }& t. q, N' ]7 n* |
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 o4 C g- R5 x* n5 p
9 v0 a/ a5 o# G! R. G( r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 v5 ]. \7 k& m& c+ F
+ i5 R1 @6 A1 }" J6 j/ X2 k
if(pshreRAM->packet_cout != count_copy)
$ Q8 K, g, h5 h4 G
{
, G- F, X9 b+ a7 q: F# _2 ]: X
printf("a is %d\n", pshreRAM->a);
6 A) _& S" t! ^: U( j
printf("b is %d\n", pshreRAM->b);
4 @3 m6 x# r/ f3 ~- F
printf("count is %d\n", pshreRAM->packet_cout);
0 N& v, @: I' J0 `- c# [2 P# J/ Z' z
count_copy = pshreRAM->packet_cout;
; }3 V0 J/ n# O7 D
}
; Z2 v$ b7 w8 D4 X8 y8 \( u( o
else
' a: K; c( B. r: `2 J9 W% g8 R
{
8 h3 |. Q# ]$ i# F* Z6 ~
printf("No effective message!\n");
, N2 ^ y* [% H b( Y& v
}
) t1 f, B5 f4 g% }* R5 \
}
& {9 G; K2 o0 d! }0 C
! [" s5 L+ {/ B! T" Q& _, K, d
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 Q v2 x3 V. @% H7 O; _
# n6 }8 h% ^( X0 G. L
6 D1 F, i6 `3 b# N4 S
2 A* z1 P# _1 @6 r j
* @0 A/ Q& G9 H7 a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4