嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, w# y& T4 s0 v( j( w* Z& }
$ C) T5 T. H, C8 V. K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
7 \9 M0 W+ r$ @9 o
#include <unistd.h>
% Q4 a4 J/ T1 D% U& N
#include <sys/mman.h>
# X2 \$ K! A& g1 e; n% | P5 w
#include <sys/types.h>
2 d6 M8 ?/ t, ]: ^# R
#include <fcntl.h>
~% Y! T0 m/ v0 G. U! O
8 |; o1 M4 g% I- B, L/ h
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 G1 v8 x1 j: a
! g2 |- ?. W& v2 r, j( g2 Q- [
typedef struct
3 a/ Q. x- x+ [9 Y1 G* g
{
" f1 _1 R: v4 `5 [" V
unsigned int a;
2 ~% I- q* W0 v( y
unsigned int b;
H* g _% J* R
unsigned int packet_cout;
1 ~/ s" p* d! j9 T# G3 L& @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! R6 S6 `. I% w4 T; b
' j4 J$ }4 [( J v( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* O" F; L# B$ f
unsigned int count_copy = 0;
E% a8 _, j5 c ^4 \
% t; V$ q1 e* w7 y4 v+ N( K' c
' L2 x8 M0 n; w4 `4 r$ n: o3 i
int main()
* |* Y) X" Q# W2 I, R+ J" @
{
6 j4 [6 \' ]$ l* G* I
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ C F+ A/ g3 n W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: o$ b3 r% |8 A( f7 n
W0 d7 [; M. Z2 C- t4 s: d
while(1)
6 _6 X2 u. X# {* e
{
& t, s% t$ {' H7 ]+ Z
read_MSG_buffer(pshreRAM);
" R" N+ b. i3 r9 P. N4 x; n
}
- a/ X; h, |( \/ Y# c& o% {0 t
}
, C# m( R8 ?* N. X: M @9 B
; w6 q6 Z8 X/ C# p/ X: t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' l9 B. J0 t; v1 ^7 c$ p0 O
{
" Q$ [- K0 c3 H6 T1 \( T7 z" S0 G6 L
RX_MSG_PROTOCOL buf;
5 Y3 i$ {; i. c2 n/ g9 ~
1 C& |3 N, z, p" f
buf.a = pshreRAM->a;
3 `6 a( p- x0 m1 B8 [8 o
buf.b = pshreRAM->b;
& z% x! Z7 W5 C( c$ ^# f; M- p
buf.packet_cout = pshreRAM->packet_cout;
, }4 z( @2 i1 t7 S1 L+ e
& L$ t( n3 D- k5 f/ h8 M
if(buf.packet_cout != count_copy)
0 N' Z) N a, O$ V" `4 A3 M% k. |3 @
{
& H! ~2 `6 A, B+ Q5 A; @
printf("a is %d\n", buf.a);
* C f6 O7 U. S' v+ n! h% n% p
printf("b is %d\n", buf.b);
' D6 l" K4 N# I _( W' @( g# K
printf("count is %d\n", buf.packet_cout);
* S1 ^4 D( Q% l' E% K& ^4 j; M
count_copy = buf.packet_cout;
: `) U# R: J% Z" y, Y1 G& q8 c; h) F
}
, j) |9 n2 c0 I) p% R& K; ^
else
- O5 d" q- T7 t( I; H1 f8 T4 w$ U
{
6 k5 O7 [: o8 d6 T$ p% F4 E' ^
printf("No effective message!");
1 W" N, Z$ d( D# T3 a
}
% D" s4 i* e% r g r
}
1 \* t- W' U8 m! P) M) o# p
$ C& ^- V& s! J; ?( q
( f p- j/ ? O# s( V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( v6 [& J& p% }+ ~/ P7 g
使用下面代码,对内存使用了mmap函数后:
; c; e- ^$ ?7 r# p) ?. J4 c* j2 l
#include <stdio.h>
9 W" e. w( j/ k( U
#include <unistd.h>
+ W) U C9 j* c' P+ L! S
#include <sys/mman.h>
- w& p C! u3 u/ \9 N6 T% \& v
#include <sys/types.h>
8 l. n( Z$ Z! z9 Z: w
#include <fcntl.h>
* `- T# R$ t, c x2 ^
3 {2 I$ b0 ~" u( ~' l
#define SHAER_RAM_BASE_ADDR (0x80000000)
- m# D- K4 o, k( x
#define SHAER_RAM_SIZE (0x20000)
7 a P0 p. z- }. a
) U# g J8 x$ p0 `0 f0 j" ~( G
typedef struct
- d3 I" `( [* O7 N3 y
{
! x3 B9 I) R8 K. |& m5 C/ [8 J3 }
unsigned int a;
; a X4 ~* p0 M3 f8 ?2 L$ }% s6 ?
unsigned int b;
) u+ {( a+ O# [8 f
unsigned int packet_cout;
) a+ G0 X8 h8 e+ K; Y$ j& U1 W; |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ n: k; {! S+ i. ]2 n7 Y/ m
- c; g! [; |* q; D- Y: v
void read_MSG_buffer(int *baseaddr);
$ k) b) ~1 H. d5 E/ o3 N! t" Y$ Z' Y- W7 Y
unsigned int count_copy = 0;
, F) r3 x( w x: ]8 u8 D
' C; r; ]9 A! k1 p+ K6 B
int main()
! m/ Q. R6 r6 L" ~
{
# I" I2 q) h( i6 o
int fd;
; A6 B" s, g6 ~% p
int *mem = NULL;
. t# B& S2 ~( G) w/ L' w, N
7 `, ]8 e; U5 E) }& }3 \
if((fd = open("/dev/mem", O_RDWR)) <0)
, @) w: c2 P$ w5 K2 y0 @
{
+ }8 J# T9 {2 S- P
perror("open error");
- R- p9 ~. j! s
return -1;
4 b/ h5 N7 F/ s9 N8 r
}
; N1 [: T% z/ h |
! l m7 P, h$ m% z# S% [1 M
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: j0 t8 x7 \+ D0 y
7 |* `, x; v6 u( p; C9 B P7 N
while(1)
: u$ b8 ^! X1 P
{
( D9 b* u; a, a' K( l1 e% F
read_MSG_buffer(mem);
6 L' _+ h$ @8 L1 \( h+ _; F& M. m
}
3 Z; s8 l5 {3 ?8 g
}
+ Z1 b* i" T3 @# e p7 F) j
]! u u. q) Z& q) k
void read_MSG_buffer(int *baseaddr)
5 U d1 G4 h, W( U6 K6 x( |: V( n
{
1 s5 d8 d5 e+ i: n) U$ @- f, S
pRX_MSG_PROTOCOL pshreRAM = NULL;
2 N3 O! c3 l* A; T5 r4 u
' E1 H* n0 [: |6 S& @8 r
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 a& a) I) x1 s7 m
3 Q: @2 T+ i" P
if(pshreRAM->packet_cout != count_copy)
* r9 }9 v$ [- x, C0 V# `; K
{
6 [; G6 m+ X7 n1 ~- ]/ J5 n2 I
printf("a is %d\n", pshreRAM->a);
2 c3 p9 U& u6 P$ g7 O! L2 a# h/ P
printf("b is %d\n", pshreRAM->b);
5 P- y2 F3 ?+ ^7 U7 p$ w
printf("count is %d\n", pshreRAM->packet_cout);
) j, T/ d, Z! K3 k- K m
count_copy = pshreRAM->packet_cout;
L, j% |2 Q% l) z# N
}
& R4 S) z# m: @6 | k3 V
else
2 z' X" T) Y- u: l! H
{
- `! v: J- V5 W0 ]; q( ?
printf("No effective message!\n");
# z& Q1 N+ c. r: a& h- ]. H
}
" Q3 N7 z4 t" o! s4 J `
}
k9 e6 V. q) M2 R
; \2 T6 m: ?0 }- @$ |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: Z; G7 i4 B8 o9 U
0 Z- h# x# Z$ o$ n
2 R8 T" m5 Z* h8 K- L, W8 j! \
+ w% W( }2 x2 Q
& D8 f" p$ Z$ R! n: M$ U
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4