嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! n. B& V: z( j4 w& [" ?4 L6 y
; J& o/ J, F- W3 L( q8 X* l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
. N/ ]( z! c w: v. R# O
#include <unistd.h>
8 O( | c+ z9 o* z) j; |" ~
#include <sys/mman.h>
' a! e5 f# }! x; g! [
#include <sys/types.h>
# l+ k; l& L" v& U
#include <fcntl.h>
5 `/ I5 K" H$ k. q9 N
9 p* ]1 |) J0 p$ N2 Z, D
#define SHAER_RAM_BASE_ADDR (0x80000000)
- n- a% e& M# V$ X: x
" ~% N: L, T4 b9 ~% l! M5 {
typedef struct
; Z" L1 ?$ ?; t1 F0 u% C' g6 H' |7 e
{
6 I- Z( D; T4 [2 G
unsigned int a;
3 S2 I/ ]8 C+ C* `/ x$ a2 c+ i# K! e
unsigned int b;
2 [3 s2 M0 c% E4 V$ u
unsigned int packet_cout;
6 W9 _2 V5 `# {+ } A$ F- o6 F- f5 c( V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# C, y2 [( G8 z3 i8 r; P
" A9 u& F- L5 k3 F. `7 M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( j+ L" W4 H( Y" \; N- G# h# w
unsigned int count_copy = 0;
! |/ R2 G* t) [- X9 U; q) `
$ Q0 T+ Z) L" T
- Y; _6 g) H$ {5 {, { R J
int main()
% Y' d! R. b+ L+ U* l0 u6 Y W( |
{
1 _8 A+ v& s+ I& l4 V0 p
pRX_MSG_PROTOCOL pshreRAM = NULL;
# X' j8 v, f' J8 O: h- |7 q
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ B8 G, J( p" ~6 Y1 E
2 b0 W# j2 n# I$ Y) H7 e& u, i
while(1)
6 N/ F. G. m% g, B0 \) M8 m' I d F
{
$ r E6 G* [; {: V6 E
read_MSG_buffer(pshreRAM);
" p. x: u2 P5 G! V- m
}
0 o' @# g8 f4 L: b6 _" l: C4 x
}
5 }6 }4 E N8 \: L. S
1 R, J2 u+ O' C7 O( [; t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 s) W4 U$ D# N! p- H" z0 I5 E5 |8 @3 E
{
- U" ]( O. G9 P" ?4 A. Z
RX_MSG_PROTOCOL buf;
* [- N% \4 `* D! t Y7 _
/ J! @2 W. ]7 }. d p7 M
buf.a = pshreRAM->a;
6 C2 A0 R/ W5 ^% ?8 B: C
buf.b = pshreRAM->b;
1 K4 @+ M% r- @0 x0 I" t% |! L; a+ L
buf.packet_cout = pshreRAM->packet_cout;
0 D; `9 T+ r _& n, J
* X+ W/ ^% B( U" M4 K
if(buf.packet_cout != count_copy)
. a- |* B. V0 h
{
; y8 C: M- d! ~4 O# V, r8 P/ V$ Y. N
printf("a is %d\n", buf.a);
- f/ q! f/ ?" w/ m% U
printf("b is %d\n", buf.b);
, v6 ]( _* E9 n: |- R1 l7 t3 C
printf("count is %d\n", buf.packet_cout);
5 r5 r" C2 h- H q4 ~0 P
count_copy = buf.packet_cout;
1 J, N, k. D0 n7 U* I
}
" S* Y4 q( r7 A, i1 x v: N
else
. ^ l* t$ x# M4 I* L
{
3 R; e0 ]$ t) @# V4 F" l$ N
printf("No effective message!");
; p+ A) L% Q" p# B* m5 n0 b. ?
}
9 t4 }* _+ w! P" W4 |8 y
}
1 ~) b2 s% U1 X6 `8 D" \
' {4 U9 X* F5 t& |* b3 ]6 i
5 ^ Q6 m2 e8 n1 i
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' e7 ]4 P" j: x3 r$ Y
使用下面代码,对内存使用了mmap函数后:
( c1 R, T" u0 g7 F; J
#include <stdio.h>
* C7 u/ B7 J, c9 O% P+ t) j
#include <unistd.h>
8 d2 w) H9 G( Y$ Z# t
#include <sys/mman.h>
2 `( Y. Q: N9 J4 {+ H+ S) X
#include <sys/types.h>
6 {& S6 R8 K0 P9 b# q
#include <fcntl.h>
; c# C6 `' d1 _/ l# ], {* w. q+ k
: @4 p; Q' s$ B
#define SHAER_RAM_BASE_ADDR (0x80000000)
: Q3 w- c0 e- G* W* n8 f l, K9 o
#define SHAER_RAM_SIZE (0x20000)
: a3 @9 v0 a5 H( l
+ d% H/ @1 C0 m
typedef struct
8 x! a) @0 e* M! I
{
. b* b, X; A& c
unsigned int a;
6 Z3 V1 m, o0 g+ B+ H* j
unsigned int b;
0 A9 O$ u. q* `- R
unsigned int packet_cout;
, R% j# d0 j. h3 ]2 G' }, j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 ], i7 e6 \: H( J: D
- S4 A; ]; K g; S
void read_MSG_buffer(int *baseaddr);
; _, ` n9 p; L4 v% J9 n; b7 W7 [& R
unsigned int count_copy = 0;
; y* H ` g7 C" }& B3 b
! G+ t: P3 J* R& w: o
int main()
7 S& d" O! H$ w/ v
{
^3 N" {. s; O- T; F+ W: i9 ^# ~+ B
int fd;
y4 b/ ^6 T4 }& P9 n8 ?8 X1 v! T
int *mem = NULL;
* o+ B& k. C! v# A! t( ^ p6 Q$ `
) f, V! p3 q* f
if((fd = open("/dev/mem", O_RDWR)) <0)
4 ~# H. P$ { @* i' V6 x" A( u/ \
{
( j# t+ N* u4 K+ i
perror("open error");
2 U; j3 B9 y D
return -1;
$ F+ V* b0 M h/ c% u' F) y: t
}
1 R0 W/ f5 k& ?5 @' q$ x5 t
) V2 v6 T9 n& Z
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% o2 v x0 @5 E; y
8 q+ } p7 z3 K& B( E: O& G7 S
while(1)
( n- n9 N9 i- S( s5 c& o% ?0 @, F: Y
{
/ ~4 A1 t/ F9 S% X; T! A
read_MSG_buffer(mem);
4 Y2 X8 T2 [4 s v3 w" R/ D
}
5 X. N: B( w% U/ ?9 Q5 O- |( f
}
2 s3 b" o/ P6 T' D3 T k8 h
7 f0 H; e4 q7 g- p3 j9 T( e
void read_MSG_buffer(int *baseaddr)
) B5 u0 E2 ?; H$ t9 u% J! n b
{
! ~# J9 ]( i2 ~
pRX_MSG_PROTOCOL pshreRAM = NULL;
. m6 H! p* H9 M5 d- n$ T
0 F- }; R3 v( [/ [! o6 j
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" t. g# K2 \4 n6 ]* j+ J
% I3 E; p$ o( H+ G v
if(pshreRAM->packet_cout != count_copy)
1 T8 O( ]' M7 {; I- k
{
7 q' \1 H3 c, `/ m
printf("a is %d\n", pshreRAM->a);
% [5 L% Y( Y" i) ^" W5 x+ T
printf("b is %d\n", pshreRAM->b);
2 Y5 B6 g8 D0 T+ n2 ?
printf("count is %d\n", pshreRAM->packet_cout);
6 H2 [) ?8 T# D5 v7 n8 ]. x
count_copy = pshreRAM->packet_cout;
# @2 X; j8 U, R9 @7 h
}
7 a' Z% r, d y
else
5 `5 m) }3 V8 I& E5 t
{
( }5 z6 R9 W6 D$ l9 k# k. X
printf("No effective message!\n");
7 q! e8 g9 H/ y/ K5 r9 [5 b- d9 t
}
. P/ D) `4 @* a) O7 J+ [0 W# n
}
' A M, x1 m2 I: t1 ?$ J9 ~% ~
! ]: @7 b' Z: T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 B& n; o! X, ~! E g
5 O5 t+ Q0 h* p: y
( J% i, I% G5 @/ g4 j Y
! _/ F2 f5 g& s7 W% x
; g/ |; Z' A( u4 ^% c( u6 r7 e
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4