嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& H$ ]% k$ L# K% Z
4 M" q! i- y" { T& e* p2 d
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 N& `5 p2 V3 a$ C' P' P: E
#include <unistd.h>
) O0 F" G+ D* }, A8 [
#include <sys/mman.h>
( c* z8 ]9 X7 _. e& O# h
#include <sys/types.h>
8 D, o% U* w4 |9 U/ n
#include <fcntl.h>
" g- Y- ~$ _' Z* U6 u: H. |+ D
% J' G& g1 P3 S
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 ]8 w2 m- @0 h% n8 r: e
4 N) N/ u2 l" G) M
typedef struct
% \7 l* x: ~/ E1 N1 B2 A
{
( x2 E. A/ B6 c$ V( f' h' R& L
unsigned int a;
6 E! [- C: s7 s. N, z& ]/ {
unsigned int b;
$ s- V( {, j2 T: Z- R8 @: g
unsigned int packet_cout;
/ ~6 r, h( U+ I& Y2 E2 q4 _" F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 X9 Q' p; |! F; |! i
2 Q3 P* t" `: \! D( K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# [2 v/ j7 }* Y0 ^7 j. l) F
unsigned int count_copy = 0;
, T, K1 S2 m/ C& ^, W" G4 g }
2 C( R& P9 z1 K# U8 z
8 x( P0 d7 g. H- G
int main()
' ?. ~9 u' }. b0 Q% Z
{
, y0 }9 ]: I9 b' p! f; S
pRX_MSG_PROTOCOL pshreRAM = NULL;
. U) a* i- U" G0 E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; ^: T1 A1 H, a. a1 K) A7 s# K/ @
: j! t* {- }4 J
while(1)
" H- I8 S- W% z: ]+ @/ }# U5 m
{
2 C8 L+ L& L/ x: d- t( r
read_MSG_buffer(pshreRAM);
2 K" {+ z# U- {8 k( a4 A U
}
: g* `# v. ^" q, w- M) v& I% m
}
x( |% r6 H0 P
# L# Y0 X& j0 k% N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ |, J3 S: q U2 ^( T/ I) q) g3 R
{
" O- h5 h, P$ _" S4 w: Y
RX_MSG_PROTOCOL buf;
* X, ?- G& W g" s o- z7 c0 O" X
+ W- f+ i5 a* k4 n& Z7 i" q! w
buf.a = pshreRAM->a;
) G8 k# I/ n t. l4 }
buf.b = pshreRAM->b;
. F( q, S. g1 b- Y0 ?
buf.packet_cout = pshreRAM->packet_cout;
5 D9 c: Q0 V8 F6 N
, J4 l( D& I1 }2 E9 i9 O4 ~
if(buf.packet_cout != count_copy)
1 L" i$ G$ n a, j P% K
{
, U8 [, |- _' k0 s- g4 o/ y3 W# e
printf("a is %d\n", buf.a);
: h, ~& M/ e1 _
printf("b is %d\n", buf.b);
! W( v+ y1 a& \
printf("count is %d\n", buf.packet_cout);
: J: @- Q/ _& U5 [% m% v
count_copy = buf.packet_cout;
0 V/ E; I4 Q& H( ]: g e* O& L
}
4 y6 C& }" J, k+ z% C) v! \3 i8 S
else
. s1 i# K1 J9 {" ^9 N
{
+ j+ k. j% [ j
printf("No effective message!");
' c! p( T' V/ W& L& ~* c
}
4 E9 R8 \9 l6 Q
}
6 h- e+ _ w; n; ?) }# o! j* c
3 ]6 l4 D. {! }9 ]
' l7 G8 P; A2 r
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
I0 G3 ~. b- O+ [# b
使用下面代码,对内存使用了mmap函数后:
2 q$ f& K4 v' E% H- N5 X/ K8 M
#include <stdio.h>
9 S4 q2 W' `2 [7 l" E5 J* d% h
#include <unistd.h>
( H% X- w' z, ~
#include <sys/mman.h>
7 _ f+ v. j; I8 _1 ?0 [
#include <sys/types.h>
; L& m& Z- f6 ^9 s$ Q
#include <fcntl.h>
# @5 E' h) I$ M9 G& V
: T- q1 H5 Q7 [, F6 k3 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ U5 K4 m w. |4 U
#define SHAER_RAM_SIZE (0x20000)
2 h2 |0 q7 n' {6 a, h
8 M1 [- `% @/ H0 W
typedef struct
! p) s* F+ W9 f$ j# ~
{
( I$ F* v' l' w* z
unsigned int a;
7 N; C0 o7 I0 Y7 i
unsigned int b;
" E2 x" X4 z! {% V
unsigned int packet_cout;
* H' V5 g, x# y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) e! d' i. J0 j# R8 ]
# d+ |) F! A9 j3 x |
void read_MSG_buffer(int *baseaddr);
8 \1 T* z) w& h i, {. p8 l
unsigned int count_copy = 0;
3 N+ N' W+ `; r$ ?# l
( k) I4 G. f7 v4 `4 J" }6 Y
int main()
8 T/ p( y5 G& u, [( z C1 O
{
2 P: N+ G# f0 \9 o% k4 o* n
int fd;
0 l6 i/ n0 f" R* z; F2 y
int *mem = NULL;
& b, f" ]% B6 `4 ^4 s" p
6 w* f4 O% a% t6 t3 J0 o9 C( P' J
if((fd = open("/dev/mem", O_RDWR)) <0)
+ M/ k7 ?. f2 S. ?8 M2 b
{
. y) ~0 j4 T% y: d3 Q' z
perror("open error");
( g, R1 {- ]! B2 l+ S6 s
return -1;
4 E! `+ E: t& p- s. V
}
% u% C: J: O" [/ {. Z6 v. x: ^
6 d) D( v4 t7 R: `/ L
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" d0 V) B% Y# t1 X2 X. T d
! x5 W2 @4 U% F; T3 N
while(1)
4 \; P2 Z8 c- f2 d. F
{
/ M) C% T2 [& g# c
read_MSG_buffer(mem);
, q( d2 W# B. J9 |6 H6 _
}
+ R' s8 ?/ T8 G" t; N- E- t! T
}
, \8 j5 n& o/ Q4 E7 w7 a
( ?" z# _, B/ w+ w' R
void read_MSG_buffer(int *baseaddr)
4 p3 [/ h2 g8 g/ g( J; P
{
, s" T+ u3 f$ S8 x8 B: ^
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ ?7 g( x* r: T1 Q2 v. N5 X
. Z K2 J! Q# k! @4 J- A$ U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ r0 q& _7 ~3 D% |9 Y; z7 P( z
. ?# F9 D. S) f
if(pshreRAM->packet_cout != count_copy)
# m, B8 D- y) B/ c, L4 n- V: @: [
{
/ ~& C4 A& k! I* t5 p7 h2 R
printf("a is %d\n", pshreRAM->a);
/ @0 l: o4 H8 N# E) X
printf("b is %d\n", pshreRAM->b);
6 l3 n& H. l, y. J- A$ s! q0 o
printf("count is %d\n", pshreRAM->packet_cout);
: H4 T) q$ p2 k8 u1 k7 ?6 E
count_copy = pshreRAM->packet_cout;
% E$ L3 A/ I1 E: h9 T
}
5 w2 g: f' ]: ?3 \
else
% Q1 P7 v1 Y, m
{
/ h) A) Q" \9 |6 E3 X
printf("No effective message!\n");
0 \- u7 `; u* \' @
}
* m, v$ Y; u4 i* r
}
( Q7 A( H8 j( X0 n
/ j, [# x. F L* m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
X6 D9 ?8 P7 U' D
% T7 }2 H* t" ` A/ {8 f0 n
1 k' ^6 c- G Z& u4 O
( {- e% {. K6 r5 g
0 z; r; u' m' ]; F- s' y7 k
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4