嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
2 E2 `3 Q: `* @7 ]* q$ Q) n2 w# D
* f$ L# u$ ?) v( V; g, ]
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 c3 X- f& B V8 b7 r
#include <unistd.h>
. ]/ r5 P; C) s" o$ r" t2 @2 A
#include <sys/mman.h>
1 j% c" a1 c7 V% m9 D
#include <sys/types.h>
# J9 i/ w5 A: o3 U& K
#include <fcntl.h>
# c- i. _8 g- W p: A w# m
7 X u; s! s, l& M" N
#define SHAER_RAM_BASE_ADDR (0x80000000)
) A. a/ W' Y$ V* Y
% D4 {' m$ I3 J1 S9 M3 ?
typedef struct
* O3 ?# O0 o. D |
{
' B0 G6 x2 u! g D. d
unsigned int a;
3 w& i; u0 U2 B" _# W
unsigned int b;
% q8 Z9 p( w! ?8 S
unsigned int packet_cout;
, _$ ^4 F8 t2 c+ l- ^ B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" Y& h- i4 G j. O7 b/ n1 B/ r
0 d! x% f" s5 M* ], S+ Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 o- v+ L0 @. N4 b) M
unsigned int count_copy = 0;
: ~" I' ]6 B1 c$ M
5 X, n7 ^0 ]4 A ?% F6 R4 D
+ Z, O7 r7 L% H5 B! x) p d
int main()
! { y I) H1 b9 }9 z
{
" { f$ Y; s1 W/ r
pRX_MSG_PROTOCOL pshreRAM = NULL;
/ p | D. c' v$ X& H' a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 E( t7 Z* A( F: Z& z, L
6 O6 W- y7 y6 @& F+ v' M
while(1)
0 R t' K- m: y( b; O
{
! j% |* Q9 V8 t# r
read_MSG_buffer(pshreRAM);
+ B/ Y/ _/ _6 {" c1 k) d
}
4 |1 I+ `1 O( Y% S, ^, m
}
- K: \ _3 R6 O+ e1 x6 J1 u
' V& q* F* L5 u6 }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: u, l2 G/ }' _" ~: I
{
, }# e5 N$ S* j( d( k
RX_MSG_PROTOCOL buf;
* ^' [* `! {( L0 t0 x" Z5 ~, N2 b
( e7 f) B) {) [' V8 g6 w
buf.a = pshreRAM->a;
7 I* x! p& ]6 L$ ]1 Y4 ]
buf.b = pshreRAM->b;
) n; n0 u5 B B; \, G( y8 y7 K9 d
buf.packet_cout = pshreRAM->packet_cout;
) o# X C, M+ c X& I5 T1 j" C
! K" z" q1 }, {- V# G, b; d
if(buf.packet_cout != count_copy)
8 |& X+ V# l9 }# z/ X+ i
{
2 M k2 j7 g8 R1 V
printf("a is %d\n", buf.a);
" S3 c$ K% |+ l
printf("b is %d\n", buf.b);
) ~- n/ C- u- `% X% O
printf("count is %d\n", buf.packet_cout);
9 g9 {4 J! ]9 {' r ]) J
count_copy = buf.packet_cout;
& t3 B) o/ _8 |( P' g8 _3 l. q
}
2 b" a! p- Z: I9 O% @* X/ W; e
else
% L' A1 `& d9 I6 U+ u p
{
; A3 ~! P" w; I6 {7 o
printf("No effective message!");
; H5 a; |# ^* l* T$ `
}
; ?; G9 l: q6 n |+ O, Z
}
3 W2 f' \6 u7 y, I5 [. y m5 o
; C% q+ E% ~( s
; H! o& Z# K |+ c: @# C2 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) V! a7 K7 G g/ ?$ H- G
使用下面代码,对内存使用了mmap函数后:
0 y' u' K! {- Q) t; v
#include <stdio.h>
9 r. y% q! f2 `6 a) q5 v
#include <unistd.h>
6 e& o6 u7 M* R& g7 v7 s3 [6 }
#include <sys/mman.h>
( a" c0 u, b& a I- ]7 x3 L0 O
#include <sys/types.h>
5 v& @: t3 {( c; i' ~3 n, |$ Z% }
#include <fcntl.h>
% f8 U& V, R! E2 h* I% _
+ O C3 p3 \4 U( o2 }+ E# i
#define SHAER_RAM_BASE_ADDR (0x80000000)
" ]* h4 U1 ^ j) i9 u4 t
#define SHAER_RAM_SIZE (0x20000)
- |1 F1 z! P- D5 g6 B, U
' _+ v3 O4 P* R$ q+ b3 X5 h3 M
typedef struct
3 S- d" R( {/ H& R( `0 b
{
6 H1 I4 q+ b6 q. O- u) M( K
unsigned int a;
/ l+ e0 X$ H/ ^4 b7 a; g2 [
unsigned int b;
" J* Y9 T: D+ L y2 F5 V
unsigned int packet_cout;
4 k7 w" E! s. W. @" t% [+ g q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 R* n/ T( N# H, Y; h
! \- J$ ?& o( n' a
void read_MSG_buffer(int *baseaddr);
/ |+ n% O) X' G6 `% t4 V6 I% m
unsigned int count_copy = 0;
$ D7 y4 d+ r. z
/ G) n4 c( d+ y6 e
int main()
4 o/ t& P$ B# R9 Q
{
) n! x$ p6 n4 k9 I3 S! X; e, e
int fd;
5 ^- `) L: B' X0 }# F! `7 J( l
int *mem = NULL;
/ q6 y5 L7 g8 _. y7 \% v
. O3 W2 \9 g6 A+ ?) T
if((fd = open("/dev/mem", O_RDWR)) <0)
7 x& C2 M0 ^5 D
{
' S6 p4 u3 ~# X! f$ y
perror("open error");
( a# d, s( M. m; H
return -1;
9 V, f j/ U& n, T0 H- g. ?) B
}
2 c- e* @0 W$ _5 Z2 h9 r# y
0 M ~' d" j4 \# r1 p- o3 @: ^
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ W) ?' q& x6 E/ ]2 X4 S( U
8 d1 n2 b4 I: b# v4 F
while(1)
% v$ O% o8 Q E1 R" Q$ y
{
# {4 y$ v" A4 Q4 w7 s0 U
read_MSG_buffer(mem);
' V! p( T+ i: l: D# x# q4 w ~
}
5 b% n9 |4 g2 g( u7 w' z! M
}
* b) I' D+ g: I& ~5 ?1 r: g2 Z9 D
( U( D7 O9 \. ^8 {: J
void read_MSG_buffer(int *baseaddr)
, h8 c$ l1 s- N9 B/ O
{
+ }& e' [" ^4 {% O
pRX_MSG_PROTOCOL pshreRAM = NULL;
& Q, J) w! ~; }
9 Q# \, }7 g# s# H0 d* i" W
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: g; `6 J# z6 ~* ^& c( P* O% g5 z
9 J3 @0 v1 K4 s- K
if(pshreRAM->packet_cout != count_copy)
8 r# |2 [% r. A
{
' l0 F9 d) C$ r7 R1 e, M, n" n, k
printf("a is %d\n", pshreRAM->a);
K' c, j6 f5 a+ c3 k o
printf("b is %d\n", pshreRAM->b);
# Y0 b5 }8 p4 y3 }+ l
printf("count is %d\n", pshreRAM->packet_cout);
* z/ G- L1 Z" ~& T" F- V0 U# e0 d
count_copy = pshreRAM->packet_cout;
! `% R1 q" N4 o+ k; J
}
0 q1 Z3 R9 Z* S
else
4 d3 ~6 B2 U4 \: Q7 l
{
5 y& O& Q% q& {/ n! w
printf("No effective message!\n");
1 j/ I+ x( n! Z0 S8 u
}
5 K$ \: t# [: Z2 D
}
6 W& H1 |8 h j: o/ }: ?/ Z" }$ G3 y/ W
& c( z! Z; y D4 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# ] F# M8 s2 ]* @$ @9 d
, A, U5 G- O& q- V% {
1 C7 @7 k' K3 W
! b# w8 ^( I7 j( _: w i% x) t
d+ P6 D1 N+ `, k1 i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4