嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
W7 u" ] q1 I X3 E: ^8 y, v: s4 z0 m
: B/ P9 B1 ~, S# y+ C& l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, l7 U. N# J& h; b! J2 u
#include <unistd.h>
- ~1 P4 w P( ^5 ?, F- Z' Y
#include <sys/mman.h>
& Y# p9 a8 A5 z
#include <sys/types.h>
4 \' m6 G7 R' d' f
#include <fcntl.h>
9 z$ j3 G# O( {4 B+ K; _; M& P: L2 h% R* U
3 S6 b7 Z$ z7 t) Z2 G+ f& R, i
#define SHAER_RAM_BASE_ADDR (0x80000000)
. H% n1 W' u0 F, k* D
, l# b, B. ]* @* q; N
typedef struct
; B l7 v+ ?8 k7 Q# r
{
$ r" _; k) c( Y" Y# d
unsigned int a;
% Y9 b! S* d0 X z
unsigned int b;
3 h. [# A+ ?) V& k; {
unsigned int packet_cout;
I; u+ h( j3 X, L4 _' D; Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& F/ E2 E! O/ |
6 X2 N" g1 a/ c) y/ p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: h! B7 f: V* I1 y7 _5 a: y' Y# R
unsigned int count_copy = 0;
" Y0 w: R, z* S* Y9 u' i
; t. N$ @% \" d1 ?% L0 V+ |7 ^+ }
+ O4 q) C4 n- F8 ?1 p% Y" X C
int main()
- x2 Y- A N& q; C
{
2 |- z% e, R6 X7 F' y
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ S5 ^! P# P* _4 @
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 I4 a; _/ W% M* Q% e
8 d9 s1 t; ~+ `4 B& _) L: v0 ~
while(1)
/ E3 H& Y1 @! k$ \3 u3 C
{
* j5 r$ S2 E* ]1 Y- s
read_MSG_buffer(pshreRAM);
; V, c- Z" a. Q T
}
6 k9 I( a1 `7 K+ M% {( A
}
4 {' J, H: Y, P0 ^' o1 U
- _3 \2 u" u V8 L" ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
J+ T% \9 [2 F& ]/ q9 K
{
- |- k" o. s& x4 N2 v2 R
RX_MSG_PROTOCOL buf;
" r0 f! p. y: I0 i3 D% C8 L F
' |+ y2 U& l$ a" u0 X1 V3 f7 A& _% v
buf.a = pshreRAM->a;
* U# H" E1 {- B6 j
buf.b = pshreRAM->b;
# J' a) P$ |7 `. D
buf.packet_cout = pshreRAM->packet_cout;
6 T$ C1 V# A* Y: {& O4 n7 Q2 C) Y
, m3 \+ D* n3 c4 X2 H) {2 M
if(buf.packet_cout != count_copy)
0 o: f# E; j9 \! ?! Z/ H9 Z
{
% n8 n( o$ H# a6 M* [0 B: f s
printf("a is %d\n", buf.a);
7 c6 ?( i1 k% t( \6 u
printf("b is %d\n", buf.b);
: B% s. f$ M6 ^# f" p
printf("count is %d\n", buf.packet_cout);
# g1 N$ m+ m+ X5 @2 d& C) n9 v
count_copy = buf.packet_cout;
7 Z$ ~1 J1 @4 l& B q$ b
}
4 F8 f' O& G4 H( ^$ |
else
- E$ W1 s' Y# l3 |2 z
{
9 J% }- w* q2 |/ y% R% N) n3 @
printf("No effective message!");
y( q" E0 L) k; N
}
: U) c% D+ K( z; P2 f* t# }
}
$ k9 t( o% w& ]4 q- O
1 [8 V1 u2 N7 S: }1 k* r
$ J, r5 |7 N8 {. W! `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 H/ {8 p8 K5 V$ C* C' `
使用下面代码,对内存使用了mmap函数后:
2 y' y- N! x' Y3 q
#include <stdio.h>
, }' U/ \) B8 q2 U, H5 i* q
#include <unistd.h>
; n1 ~. v; o J4 q7 Z4 j
#include <sys/mman.h>
- p# q9 l, n8 C) b
#include <sys/types.h>
, H! y; W; [5 y, G a& H* V/ v. o$ g
#include <fcntl.h>
7 A7 ~1 V8 a/ s r. d9 G g. h
5 D7 K- H6 J$ y# m
#define SHAER_RAM_BASE_ADDR (0x80000000)
; [; T0 G6 p0 o
#define SHAER_RAM_SIZE (0x20000)
: I) R3 v, G: W8 Y' q
( w' ?4 H/ F& B, N8 M
typedef struct
: o# W+ k9 ~: z* J1 F
{
5 k( X5 ~" }$ c5 E ^
unsigned int a;
7 V9 T8 K7 u5 I% I" R* m
unsigned int b;
9 X( G* ]( ?9 Q2 v
unsigned int packet_cout;
9 V# ?% S5 _* |: i# ^$ J3 Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, D, S/ n4 a2 K: E/ _7 `! [+ m5 Q
3 D! q( e/ @ z
void read_MSG_buffer(int *baseaddr);
; M2 b# p7 L+ S1 v3 G
unsigned int count_copy = 0;
8 X8 v- F6 C: `5 t( M; B
5 {7 N6 T6 L) T
int main()
! ^: C8 V- w9 g& V
{
3 y% \. p% B5 h" h4 e7 U N
int fd;
# E( @4 s( `8 T: u- P
int *mem = NULL;
' \, f2 f6 j9 [1 w7 H2 g( y
9 ~9 E8 h- c6 X5 n6 C* x
if((fd = open("/dev/mem", O_RDWR)) <0)
! x; O3 N# {$ h @
{
! l3 n1 G! N( ]. A. d5 f' P
perror("open error");
% Z6 W$ M- N/ F' Y3 [
return -1;
- |: w8 J* P/ ~4 w
}
, X' \" R \! s) m7 X& z) z
2 } \/ |# \' U/ p, E% |- y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 d! X/ O6 J. w; v& I( ?
; t4 R1 L8 P4 y3 \+ d5 d
while(1)
6 j, D( U: c; m# N
{
+ X! V7 M" k/ V! R& k- ]; @
read_MSG_buffer(mem);
* Y1 i- e+ u" S/ b
}
6 S* a8 S9 _+ d3 q8 V( o, t
}
+ ~/ u* \, s# [) q
7 m- \ u0 n+ O8 u( Z- v
void read_MSG_buffer(int *baseaddr)
# {- N/ h! i/ C2 W( j* K0 ]
{
% d* O. B1 v' r9 V$ t
pRX_MSG_PROTOCOL pshreRAM = NULL;
; m! c7 }: n: q. M( ^8 d
( X! l7 J& y$ a& @
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 P9 x9 W2 ?9 w/ ]+ ]% q5 w* E
' o2 @; Z! x3 u
if(pshreRAM->packet_cout != count_copy)
7 t' h- @ r4 @
{
! ?0 f& Q4 R7 k0 @0 {
printf("a is %d\n", pshreRAM->a);
: O$ V' M& T# x
printf("b is %d\n", pshreRAM->b);
6 z+ b, g7 k' [. s/ \& |
printf("count is %d\n", pshreRAM->packet_cout);
9 }, C* v0 a9 c# H9 ]
count_copy = pshreRAM->packet_cout;
" {' i2 e- t/ E$ q6 g1 g1 T
}
, k- {% y9 Y" {; s! \3 h
else
+ @( [7 t% c% G* X6 G {4 y
{
. x" b G8 \/ g4 K1 w" x: j
printf("No effective message!\n");
5 J, _* B8 _. A; n
}
7 c' y, K9 r1 C$ ]2 g- U; R. Z
}
3 F! k, H ?" i3 \& P9 n
' X5 [ _: k, R& S7 P
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 Q4 |- @/ \, x' X+ q2 i7 X+ Y( _
9 S U! e6 y. c0 ~7 x
1 O6 W9 u/ b9 m( E$ V* A
& j8 A/ \- j3 ?/ s
7 q1 r0 y4 J2 p. |
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4