嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 F5 ^& X# N9 [* ^, _5 _& R6 M$ [
; v7 \ g5 T8 a+ r1 W2 I7 S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ [+ Q8 ^2 r! {
#include <unistd.h>
6 b/ f; z7 H/ b% B
#include <sys/mman.h>
0 ^/ y' E X) C% E3 x5 p
#include <sys/types.h>
, W, q" N7 k: y! M. v
#include <fcntl.h>
$ [ d5 B" G3 X+ f8 K) [: c! v
* A O n% y$ g; r- c
#define SHAER_RAM_BASE_ADDR (0x80000000)
& R3 L0 d% W+ t) V
4 E( J! F2 D# }8 \; L
typedef struct
( a- A% F4 S+ ~1 V8 Z0 O# z. T
{
. u( j. `2 n5 r" B0 O
unsigned int a;
. \5 q7 O C; z5 C. v2 U0 b- v
unsigned int b;
, O# k! X& v: T+ t2 f6 @
unsigned int packet_cout;
, B ~/ [+ w. N- z- V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 c$ X/ f! i5 {/ m# _1 B
" z5 i) |8 [; v, n1 o6 m+ n- ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 x) E1 r' @% T" Y0 S
unsigned int count_copy = 0;
. l9 g4 s! c- q6 b& G, V* {+ S
; y5 M, q% N- r- Q2 i
0 s8 T6 B2 _* Y# t
int main()
: q8 ~( ~& G8 Z+ Z' C
{
4 s, N. W' \$ d! s0 J
pRX_MSG_PROTOCOL pshreRAM = NULL;
# ~* b6 s! H5 z# \
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 M7 E+ y7 o. q" X( |' q# M
" d0 U4 ~$ m b' W! g
while(1)
1 m1 Q1 P$ U8 i' F" e* e
{
2 N. `8 m( j% U. F5 X
read_MSG_buffer(pshreRAM);
" @. ^" a/ N U+ H# ^
}
% o% e2 O# T9 A% R
}
$ q, V! B* I: Y" k- G
3 Z# P8 K" Z. r' h
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 n. ~2 `4 ~: Q" _5 {& o
{
" y, \; q5 |4 u; i+ H2 J
RX_MSG_PROTOCOL buf;
$ d, a/ |" W2 H( d2 n
/ M9 m; G- y9 f1 v
buf.a = pshreRAM->a;
1 _8 V/ w; Q* k) N8 N1 E
buf.b = pshreRAM->b;
$ I% _+ J$ v& d* K; e$ L0 i1 K4 ?+ S; ^
buf.packet_cout = pshreRAM->packet_cout;
/ r4 I* Z+ @7 O9 ]6 a5 y
, R+ d6 B4 f! _7 C( j
if(buf.packet_cout != count_copy)
9 \+ b7 K' V$ N& K
{
0 }2 m* x. q$ y. c3 Q' J
printf("a is %d\n", buf.a);
! E7 K1 R3 k# T: e( J) u) x
printf("b is %d\n", buf.b);
' P% s i5 w7 o: h" f7 f: U! @
printf("count is %d\n", buf.packet_cout);
! c: e4 v5 q5 r3 V! ~: L& b0 ~/ r
count_copy = buf.packet_cout;
3 `; }0 Z+ {+ B9 Q- ^
}
9 H* s: ^& f7 ?
else
9 `9 M& J8 Q1 I! K% s
{
# ^9 I. F. ~& \) [1 u
printf("No effective message!");
) V* x! `* l; Q; |. Y7 ?9 X% H
}
- |5 D1 t( m! D
}
8 f+ U; S- ]$ I; U
$ g: ]! r' H! i# ^
& m4 |9 [7 E3 m4 H/ P/ U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* C! D3 y6 E1 a) X6 H" O7 s! r9 D
使用下面代码,对内存使用了mmap函数后:
8 u) n8 _# I, J P6 E2 o
#include <stdio.h>
; ]$ W( Z, {+ }8 `
#include <unistd.h>
/ H3 N* Z, L- t* ~% N
#include <sys/mman.h>
. q- T4 F' U8 p" o9 U" u
#include <sys/types.h>
" |& j( g" e# |0 \$ F! U+ o
#include <fcntl.h>
" W& h4 Z( O: u8 D* O' d
9 D3 _) k5 }3 J- ~) g q$ s# k2 p
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ i% Y- X8 W" ^6 u) q( Q( e, B( ]
#define SHAER_RAM_SIZE (0x20000)
# ]3 |% ~( x5 R9 _8 J6 L
, u/ a. a/ W5 C
typedef struct
0 B7 q3 u- u2 L' B9 l
{
1 U/ e* G8 M1 t( C# r
unsigned int a;
0 \' r- K/ u( Q- n! m* d. u- t
unsigned int b;
9 I/ b" e" o" C0 D
unsigned int packet_cout;
/ t! M! A, i/ J" L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 p8 E9 ~3 L4 z Z2 I
9 }4 E! ^5 D1 l0 @* V2 d1 v
void read_MSG_buffer(int *baseaddr);
: B% h! N: q g, {, C) K9 v6 ?5 w$ L
unsigned int count_copy = 0;
/ b) g. }; O3 k$ ]2 Z S
3 A/ Q" _; t# l) ^! z; a; _
int main()
; f( Z! k6 j) R3 ?
{
, U0 Q' j5 q+ w' H" p1 d4 i6 B
int fd;
( p2 p& a: h p
int *mem = NULL;
+ A0 z- z3 g; C" J8 g! Z: f, b
% }# C, p- ^' Z1 ]6 Z* j6 H5 {! \
if((fd = open("/dev/mem", O_RDWR)) <0)
d! q# u( j" n5 o+ y' x& I; n
{
|% e5 g, h& |
perror("open error");
" p8 m& h5 _+ x9 c
return -1;
; w* P4 X1 i) L' R
}
3 ~* e1 a" y' c( E$ i
% Y( \; @4 K1 U# j. W
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ E! u1 T+ C8 b7 x
+ Z, L& d# I( r' D
while(1)
5 R8 A `( s, j8 g
{
6 _/ J- _* y' O. ~# Q
read_MSG_buffer(mem);
; i& _% f' e& `' S
}
( a0 Z8 n& X ~7 \
}
' h) j: Y. L9 b- s/ K. D! O
) Q/ J/ O! e/ b- b
void read_MSG_buffer(int *baseaddr)
2 s! e4 E1 U0 b1 z
{
. @0 r4 c2 i* y- A/ F8 [
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 L# o0 L- H, s" |3 p
0 R- g4 ]: \/ Y( `
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 X5 ~# D0 t' ?
4 ~; `, c" ?: j0 w4 C2 Q3 }
if(pshreRAM->packet_cout != count_copy)
! q M) l/ q( V9 Z
{
7 U6 e' T K) v, n3 M
printf("a is %d\n", pshreRAM->a);
+ |, G7 l! i9 X9 Q
printf("b is %d\n", pshreRAM->b);
! x2 U# ^0 B- ]1 Y
printf("count is %d\n", pshreRAM->packet_cout);
- d/ O+ m( s W. H! J' h
count_copy = pshreRAM->packet_cout;
: X& i' d0 q @5 I) W/ B
}
( l( ~" x3 b0 N; ~
else
, H1 a, c- V) B1 e" ]
{
" j& Q7 e& z4 ]* Y
printf("No effective message!\n");
; i& Q8 M" ^7 ~2 y8 U
}
$ k2 ~1 Y/ c1 L6 o6 m! S! L1 n' F
}
: w) @ B3 h5 V. a
4 j# b0 j- J' G t- D$ v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: C% c4 P9 ?' e2 D5 k ^
; Q% B2 e! w( p: C/ h% ]
( Q9 c. M) W$ b K; f( d) z @
' ]$ E+ h& y# P6 d C# V: e0 D+ ?
4 l3 C/ t* |' S/ l1 z6 [
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4