嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
$ ^7 t$ I. m! K- F
# c6 Y( g' O D$ z" Y w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ t' b2 S6 m# f+ h# f: @) o
#include <unistd.h>
) p$ ^! b+ V- j6 P' w$ K' X4 a+ H
#include <sys/mman.h>
# ~, L; i. f+ U
#include <sys/types.h>
1 S# R/ p; d1 O6 S
#include <fcntl.h>
' w1 z. j8 l2 j/ x
5 D! q, E" N z+ n& L
#define SHAER_RAM_BASE_ADDR (0x80000000)
$ t9 [% P$ {% d4 z0 N3 r5 h/ h
- A8 T5 I8 ]$ u8 N! ^8 v( v
typedef struct
( b0 S( M: v. I% D* T$ G
{
- ^$ A. z; m* w, f6 W
unsigned int a;
8 w' }1 @" {/ J
unsigned int b;
1 Y* Y! X& t3 ]! G: W
unsigned int packet_cout;
4 D3 u9 ^, p9 \/ v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 E6 F. M, q9 J% o! g
: b$ d' z }2 u, v' l. I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) x, u1 M' p5 Y1 V
unsigned int count_copy = 0;
2 g& X) i7 B. M+ c) S
- v! v1 _. { S" x* U8 Q" F- c/ Z2 n" z
3 l' s! }2 u2 I; _ C& c. [6 P
int main()
- g* S6 o/ s& a1 P2 Y7 s
{
& b9 ]' z& X1 u( d$ `8 Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 A+ O7 A' K7 z2 E' }
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, Z0 B7 j+ D2 G. M* q
3 t7 d" U# P9 ?2 m7 o# ^+ p
while(1)
' o% @# M' G3 P! ?' H
{
3 c. I& J2 U9 d1 o6 Z
read_MSG_buffer(pshreRAM);
( {5 _, Y, F `
}
0 _! d! `8 h0 H# h6 m
}
0 A& d" C0 q" o/ o4 N& U
4 Q/ i( `$ J; G3 |( j% Q0 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. @- A; w4 K3 a+ P
{
& ~# a7 \, M# |. m
RX_MSG_PROTOCOL buf;
# {4 E7 |; V' \$ z
: p" b9 z' ?3 T+ R L
buf.a = pshreRAM->a;
! Z' o" p0 _" ~" K4 x [1 V+ u! ?$ _
buf.b = pshreRAM->b;
' `% e/ b( s7 J6 m1 }4 w( j: U8 K7 d. z
buf.packet_cout = pshreRAM->packet_cout;
0 K: U0 a: S j( s
U: t3 f* G2 A z5 X* J$ c% X
if(buf.packet_cout != count_copy)
/ s2 ]8 [; b1 e; O
{
) w7 B. p! U! i0 |5 i" M
printf("a is %d\n", buf.a);
h. c0 @5 I+ w1 Q& n3 ~
printf("b is %d\n", buf.b);
9 T+ S" j/ i2 u) D( W# z
printf("count is %d\n", buf.packet_cout);
; v3 S0 R G- x+ j9 V
count_copy = buf.packet_cout;
: t/ C2 g# E) g# O5 {) D9 M
}
7 l$ A' v6 a. I
else
8 O' B; V* e- j
{
; G" D4 C- P, Q# g l- A
printf("No effective message!");
* w; O5 S+ f5 f- T N/ O' Z
}
" Z# ]% O1 f( t
}
) b1 D4 w4 h7 K& y
6 M/ U; z2 a4 T4 l& p. Q. j
5 \3 U+ c9 f# `# Z7 U8 }/ [
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 h. T* s. _4 `3 B; Z
使用下面代码,对内存使用了mmap函数后:
7 o* x; z+ K2 e6 ^/ z
#include <stdio.h>
, Z4 k3 b) _- h4 G
#include <unistd.h>
% Y3 y; _4 F5 ^( S1 D- ?
#include <sys/mman.h>
# L* V' U0 F& a: L$ t- q! p
#include <sys/types.h>
2 E6 q v$ e' B' ~5 g
#include <fcntl.h>
( l4 L" m7 I6 ?5 R7 d! i$ X+ y
& Z' v L) I- Q& E% e; R: }
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 E) { a$ i- ~
#define SHAER_RAM_SIZE (0x20000)
" x; v( L+ n" w
/ E1 `8 R. @5 W9 q
typedef struct
9 k w+ j( {3 r
{
5 U5 m4 K7 X- X; b1 L: g$ k5 d
unsigned int a;
0 _+ _! Y: ^. A; ~' Y( L
unsigned int b;
0 X* `3 V- ^- E* `" Q% b
unsigned int packet_cout;
9 v$ `. P$ g! _. f4 u3 \* }9 k" ^
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* J6 e' A6 @9 K" V# v0 P
, h( Y- L7 ]- {0 y3 Z' a
void read_MSG_buffer(int *baseaddr);
) U* ~0 w6 N% D: d8 P
unsigned int count_copy = 0;
& B9 ]7 E: D+ J& \( F- [ w2 C
& T& M, D. l0 d" X: S4 o
int main()
" z# b& j( Y3 W+ R0 F
{
/ z9 H6 o, |+ w. q( a. @
int fd;
# b. z! q+ T, n w* v- S+ G1 j
int *mem = NULL;
! o* A- Y, q, V$ r: p" S& T
. Y0 p/ E& V' y- p+ J a
if((fd = open("/dev/mem", O_RDWR)) <0)
- p+ g- h: u0 J1 h; R J
{
6 f' ^- L: I7 b: W
perror("open error");
! G- L. X2 I6 k) p0 S2 C# }5 i2 L
return -1;
+ `6 K% ]- H4 Z4 y* C; d8 ^# X1 I" O
}
8 `% X* ~/ x6 T3 ?" @& G% ^
" w1 s3 i( v5 B- E/ K1 H; D
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) N. ~( ~1 f. h% h! }3 b' z
2 {. W/ W0 J+ u5 Y: {# q7 V6 L
while(1)
5 Y! M" m. z2 W$ d2 F/ ~
{
9 j9 l% ^& b4 ~$ [. ?
read_MSG_buffer(mem);
" d8 ~, I0 S& d/ W, k6 N+ z8 \% H
}
8 i, X: c/ I, e
}
, g& e! A+ Z! q8 l9 Q! Q
" @8 J2 O& L* r4 Q, `, B8 Q8 ?
void read_MSG_buffer(int *baseaddr)
! j; @( ]1 s, l2 R- K! S
{
! p. _ E3 w- Z6 e# F/ A7 A
pRX_MSG_PROTOCOL pshreRAM = NULL;
( |% }3 K. h0 e) X* C; w) A2 C
9 E; s+ p* I, y/ X/ [. w
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& I* |1 r5 a. }9 t# O( j* k0 C+ E
- D, h! A& Q" }4 }- T7 D I
if(pshreRAM->packet_cout != count_copy)
8 t6 p% |% m: \8 Z7 d
{
9 \+ @ M! c6 T; B( @* H
printf("a is %d\n", pshreRAM->a);
2 E% \1 f8 [. w u$ `
printf("b is %d\n", pshreRAM->b);
% C; M8 R2 n) w8 |1 D$ J" ^' f* n" z2 G
printf("count is %d\n", pshreRAM->packet_cout);
7 i* O) x0 K: N' }, p
count_copy = pshreRAM->packet_cout;
* }# g/ o5 {" n$ K0 h
}
$ z: S; {' i3 Z. w. B( p9 g
else
& \, `; [' R4 Z, ?. E
{
. \6 W4 M) t1 C5 j$ E/ v
printf("No effective message!\n");
I2 _" ^7 h" D# P$ K6 h3 }, @
}
$ ], U. o: g6 U- C
}
7 \9 q) R8 M4 o& S$ H
, _6 ?% p, d8 r' [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- O) Z- E3 A. O
7 O( p4 K7 G6 \ v3 ]3 ]9 ^
* x, E( Y+ {6 G7 t$ i3 X
* n: m3 `! r: Z4 I2 o1 c; j$ j
! r6 S+ ]4 I; X0 K) p" P* b' J
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4