嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" B) V$ j5 C* ?. T( f6 n/ X6 Y
$ V! r& |2 y& L) T" h' ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 [9 y ^& w. R
#include <unistd.h>
; C; U# Q" @! q2 _
#include <sys/mman.h>
# c1 C2 r" x. t+ [
#include <sys/types.h>
2 Q! K5 m' z3 V4 O5 Z7 x" M
#include <fcntl.h>
3 D1 F; U, @) M0 Y; P
' e( @$ D7 B2 X6 [
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ ^% ], g. d* S7 c
' f r( @* q9 h- _! V+ {
typedef struct
/ }1 n7 `' g1 ]" r q5 S
{
& e, |% O; u: T4 ~2 P9 s; K N4 Q
unsigned int a;
2 q! K5 T" D; H- @( U9 ]
unsigned int b;
1 l8 L. X1 i; v; S7 j8 {1 B
unsigned int packet_cout;
* x2 T ?( _6 F9 @- h5 Z0 ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ H# b7 v/ S5 m9 y! Z$ Q
, M2 ^7 \+ {+ J+ M1 A0 n% X5 t+ V. O7 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) U5 y6 W6 u9 [
unsigned int count_copy = 0;
$ J- b! z0 H* J# U( @$ O: ~! h
# o" I! d( F# m9 k* d/ G
, J' \, w- x' t4 Q+ O
int main()
( H; \6 r, v! Z# i8 q# w7 \
{
6 R& r1 u& S- ^- s
pRX_MSG_PROTOCOL pshreRAM = NULL;
, x% D8 O6 R+ ?, P
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 G& V9 l$ }2 \5 a8 G+ k( y
6 |8 F8 D3 N+ t S+ C
while(1)
6 ~5 d" x( `. y. y* Z
{
, H( J) E( D" g8 K) Y- ^" S. S
read_MSG_buffer(pshreRAM);
( q" k* E/ s. M0 A
}
* l/ F; z( ?3 i+ m) A1 k6 L4 t$ M
}
4 [2 ~' _9 ]- }+ ]" R
8 Q! L: f1 `/ A# a1 m8 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
M* F b$ E# A4 P9 E4 P
{
& c. W$ E( q4 J& q
RX_MSG_PROTOCOL buf;
5 _& L6 t; m, W2 k x! y7 j% _6 O
: A8 w" w* A' W# R) j4 o
buf.a = pshreRAM->a;
! h# d$ Y1 r& g* x; i+ a) j
buf.b = pshreRAM->b;
8 j1 Z) B( ^' c4 M2 ~. d8 A
buf.packet_cout = pshreRAM->packet_cout;
- Y( r- H0 t7 |
' M |* b/ f0 [7 G4 q0 k% m
if(buf.packet_cout != count_copy)
. v: a" A8 b( I4 J# n
{
8 L0 r3 c/ [3 q+ C
printf("a is %d\n", buf.a);
- E% U i7 T+ L
printf("b is %d\n", buf.b);
$ c* G+ y+ |/ \& N% U7 ^
printf("count is %d\n", buf.packet_cout);
( @; m3 Z' q9 ?* k( L: p
count_copy = buf.packet_cout;
3 V0 @" ~" D, \4 Z
}
7 D" g3 Y' y/ O# I3 m4 [# C% v
else
5 W2 U: J2 b0 `
{
; w+ _8 f' q# f" P5 I0 G) d; V' p1 j
printf("No effective message!");
" h8 R" e3 F/ d; S) I P
}
% F4 X! Y: G9 Z+ w' g# l
}
8 Q9 P/ h+ w7 T* P3 p
' }8 j4 N V$ `2 e* {* p
K( a- x0 L1 s; b2 A# I" }2 o
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 ^- Y+ O# ?- t6 d% X f
使用下面代码,对内存使用了mmap函数后:
) Y% z s! i6 O
#include <stdio.h>
! B" b% Y& `4 K+ I
#include <unistd.h>
, b# c B, y" }. ~
#include <sys/mman.h>
6 h C/ |9 y+ r& e7 U; g; }* G
#include <sys/types.h>
7 }3 Z3 q0 c5 ]7 i
#include <fcntl.h>
0 p- o6 ?3 X4 i3 g7 `5 X
* @: i% h3 ], D+ P% c
#define SHAER_RAM_BASE_ADDR (0x80000000)
( r# }5 }& t) x% v
#define SHAER_RAM_SIZE (0x20000)
% K: E a, ], `6 f; U
5 k; }0 ^% u! n8 ~
typedef struct
, V) V- n2 \4 F% E# t
{
2 _" K5 D- U) B: T" t
unsigned int a;
8 `" V% J5 ?2 U9 l& r
unsigned int b;
; k }8 a0 P" Z. q* u& p
unsigned int packet_cout;
) L4 X' d! [9 i) t8 P7 ]2 r3 Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A: f1 i( w3 O* T4 q- `4 j
5 E# c8 J7 E; @! _
void read_MSG_buffer(int *baseaddr);
/ h7 |- f; b0 d1 ^9 H
unsigned int count_copy = 0;
* p! U+ \! J1 @2 k
0 w9 a( `* T0 a3 z
int main()
' _5 M9 ^5 W V9 f. o& u
{
+ r7 x1 ^3 i" n0 u; Q! z
int fd;
- I& P4 v$ U- f
int *mem = NULL;
2 C4 o6 I/ a2 m% q. |2 s
1 E* o9 L* P/ i I* i/ R+ x. S5 y
if((fd = open("/dev/mem", O_RDWR)) <0)
7 K& X7 K9 H/ @; Z8 ^$ h6 Z
{
' t9 ?& X8 n) n5 Q
perror("open error");
. `! `' w& B' U! A- z
return -1;
' ]) n/ N. B- E" q( Z& Z
}
2 b- H6 w0 V: ^9 J( n
+ K9 @# j+ F: w# X7 N/ e5 D% @
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- K# {5 ]7 ]$ I4 {4 X/ l
9 R$ e0 ~9 c, Z; C/ P
while(1)
/ B9 _3 X, f- a7 c) G5 }
{
2 F% J& p$ j& G$ r$ B1 D
read_MSG_buffer(mem);
1 [6 ^) K7 M: b( N2 p+ e/ @. [
}
4 g Z& \& q+ d, \
}
* f. P, \: u4 ?: N
1 H ~. m- ]6 Z0 }0 b
void read_MSG_buffer(int *baseaddr)
* r! B! P& n8 e8 ]# X6 B9 _; l
{
& C, k* l/ p5 |/ Y! s J% K& `1 y
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 a$ ^, c. q2 `1 z
% F4 q) k! w: j7 x
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ |9 g8 T! H( {0 T, y: O
2 f6 O3 q1 x: Y+ ]7 e9 V$ G7 k
if(pshreRAM->packet_cout != count_copy)
" Y+ H, z& h1 u. ?3 c. P0 D) o
{
1 {7 @' Y* q) K, v
printf("a is %d\n", pshreRAM->a);
! q: y' k9 b3 Z( s
printf("b is %d\n", pshreRAM->b);
6 B/ U0 V$ p4 a) s, n c4 ]
printf("count is %d\n", pshreRAM->packet_cout);
1 }, ]: M: _/ S
count_copy = pshreRAM->packet_cout;
9 g. |1 l V9 N% @
}
* c6 ]6 r3 Z1 R' _4 }
else
3 m. X6 _: b) i( P/ O
{
6 S8 x& [1 f# {4 C( m4 }
printf("No effective message!\n");
& `+ v' u: h/ x0 [$ h
}
6 W" R( \+ ~; M
}
5 J( y" {+ f3 y
* J% w" R" i, d! j
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 u) q0 { O0 g7 k' l* S2 A
+ ?$ X0 U- K1 q$ b2 t+ H
0 \2 N- V' v. c5 H
9 ]# b7 d# ~4 d
/ {7 w- O# D6 f, m. a
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4