嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 b! q) i8 h' I7 g" O* n
& ^' u! D$ t3 M7 i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ J# d! F) G5 s
#include <unistd.h>
! C! t/ K! g) ?% E
#include <sys/mman.h>
& }: E' M. A- u, n- ^; D
#include <sys/types.h>
+ c" Y- p1 x$ j8 w$ k$ R
#include <fcntl.h>
1 `# Q! D; D$ G
5 ^4 T* W% u) d J0 i
#define SHAER_RAM_BASE_ADDR (0x80000000)
; \( I6 Y0 A4 C+ u# I8 G& Z8 A
, P; F, {2 I3 j3 `2 U4 K; |. ?
typedef struct
8 q& f' l# P$ c( v; j# H+ i/ Q
{
/ X/ f W J/ |7 o F5 T) M
unsigned int a;
# p% |# O7 M% ^# F9 W1 i. u/ S
unsigned int b;
# [- j4 a3 W* @* `1 k+ L& \
unsigned int packet_cout;
6 Y* t1 g0 G5 @& [$ [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. T4 n, ^+ ]1 X5 e7 V" H* ?
0 s( s6 L8 l4 R& ^* Z- H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' [: b4 G$ n! r4 z* A
unsigned int count_copy = 0;
( N4 H3 |( s5 S$ a. y
" R2 r/ |3 ^2 [, o
D6 W) s: y! S) \ s0 m2 ^
int main()
2 e6 H6 q v$ p3 Q
{
1 O& \% l# i0 w- m
pRX_MSG_PROTOCOL pshreRAM = NULL;
$ e( Q2 S0 U2 ]" \9 _. E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ r, J- f# |; N6 f
' S# S, O1 ~, y, ?$ L7 |2 k
while(1)
2 V5 F/ l. ~4 z( H0 L
{
, z! ^+ o Z' ?0 p- R n4 V9 r
read_MSG_buffer(pshreRAM);
/ d0 F' y {* L$ y# I4 L, Y# b
}
H C; G/ W5 J. ?( G5 I' b
}
& S* P6 X3 z, B
+ N! m( ]5 C D1 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, D6 _ A7 i1 M1 M7 \2 N
{
9 P% n S0 m4 Z/ { h5 Y
RX_MSG_PROTOCOL buf;
) K/ ^& H J/ {
) x6 y' Q; U2 R" m, d
buf.a = pshreRAM->a;
* o- R" x# C y
buf.b = pshreRAM->b;
2 \: F& I( L) `8 s2 [5 S& O
buf.packet_cout = pshreRAM->packet_cout;
' N# o1 x: Q# m1 y7 }3 |% s
% s5 e! J% u8 K% a
if(buf.packet_cout != count_copy)
& b8 R( g8 B" K
{
, y) H! q* _3 ?
printf("a is %d\n", buf.a);
; F: p/ D# L. I' N7 N0 Y9 D
printf("b is %d\n", buf.b);
9 G& V3 o4 {/ `" V0 f
printf("count is %d\n", buf.packet_cout);
4 E; p* K* j/ d z O! O7 Q" m7 K
count_copy = buf.packet_cout;
' _: s4 {- z3 ^* X$ ]/ J8 \
}
( y( p0 c$ u9 ^/ r
else
+ s7 P4 J: [) @' T
{
3 Y# @1 c2 U2 p1 |" U( `) y2 I
printf("No effective message!");
\$ g; E/ P6 B. r- l1 d
}
) N) O1 w: Y" ^4 L7 p( c
}
2 k, Q+ G4 ?( a' l
; P6 U2 K: a9 r- S
' n' X. i! l% g8 F
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ Q0 U: e! O6 w( J% q" F2 w2 y: e
使用下面代码,对内存使用了mmap函数后:
; J4 I3 n6 h4 _5 m% v
#include <stdio.h>
( m8 d) Z) ]* \0 R
#include <unistd.h>
3 R2 o# o7 N# p/ Y3 O0 k! T( A5 U
#include <sys/mman.h>
* d( j: }! E% S/ V( C+ d% X& Z$ D/ s
#include <sys/types.h>
+ j/ f/ Z$ Z2 ^1 A
#include <fcntl.h>
8 p7 q, L4 @+ z" _% b6 F
' k5 o* @- k# X3 Z0 U, N4 j
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 q1 _) n: _2 @/ m% D n
#define SHAER_RAM_SIZE (0x20000)
- |* ~* N! f8 O. g. s9 y. N
% r, z3 h5 D8 B* Q* b7 f
typedef struct
5 Z( F: v* h+ d9 H# V
{
6 ~# j) T7 t1 C6 X5 G; c
unsigned int a;
0 I+ d" f+ j# k. ^8 b* f; k# F
unsigned int b;
( w0 s/ |2 m' U( z1 k
unsigned int packet_cout;
: V8 g5 i V! x5 O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( S% a! Y* n. M% h7 X# M
. k* R0 g& x1 N8 Z
void read_MSG_buffer(int *baseaddr);
5 I0 U3 \2 i4 P: s8 F3 l, V
unsigned int count_copy = 0;
$ I8 @, t- T- g, x7 d
+ r/ z5 h* p4 x: T7 e/ S4 I9 L
int main()
* k' [4 h. p) s1 L. m2 O9 L
{
5 v; \% j9 ^* u; s* T( F
int fd;
" ^4 c w* m+ l" x0 P
int *mem = NULL;
- j0 |9 s& E5 \( v% `. F1 k9 f
- s1 C- T6 ]" _1 H% J2 |
if((fd = open("/dev/mem", O_RDWR)) <0)
$ O0 I8 ]' P, ?7 K8 z1 M
{
( k. K3 ?1 ^, N) Z. `. |4 u
perror("open error");
" J& J$ Q& m, E; B q
return -1;
' _0 a; O1 S' i8 c* z/ |! h
}
" w/ X1 q$ n7 I7 w- `5 {. V; l9 R, v
1 p4 R1 ^+ M5 G, ^+ ?1 H' r
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# g' B( Q. R7 V$ L/ M3 q
8 x4 y- S7 S% K; ~4 j% }; \- `
while(1)
7 W# d: s0 z/ R! H* m" A
{
, i. g6 H% I1 p& q- \: @ o9 g+ e
read_MSG_buffer(mem);
9 e8 E9 x; f, l
}
: F0 }2 u" G S) l, N
}
# a% K. `6 L* q- u
8 I& r6 u- r* f
void read_MSG_buffer(int *baseaddr)
) n( V, t' w+ S- u" b2 D8 i X
{
$ X- C2 r( |/ |) z
pRX_MSG_PROTOCOL pshreRAM = NULL;
; o& T5 I- v4 f
+ B# _/ H, t/ p- q) h3 w5 P9 s
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- c: C, ^7 r9 I
0 J6 B4 F" A3 k, W, j# ^2 v! ?1 G
if(pshreRAM->packet_cout != count_copy)
& R* T" y+ N/ K7 @
{
4 K8 u5 C& I5 v4 j2 `6 Z
printf("a is %d\n", pshreRAM->a);
! g7 O9 m' T5 E+ a9 d
printf("b is %d\n", pshreRAM->b);
. ]; B& W, g* U& Q1 P0 Y$ }
printf("count is %d\n", pshreRAM->packet_cout);
9 e0 w* V: a$ Q* T
count_copy = pshreRAM->packet_cout;
n, x6 @: ]& u" a* n! X: D# X
}
0 u8 h9 S1 b M
else
, q3 D6 m8 m$ B! C+ ~; c4 E
{
_5 m- p& Z" p3 ^0 W ?
printf("No effective message!\n");
5 G. \ g- `, |$ G& t3 r
}
2 B# \3 b7 h7 A( ~
}
' d8 p& d0 G* }
+ [& P& x8 g( D0 X1 G1 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 V( L% Z+ M" |
. w% ?. R# f1 @' x' }4 W' ^
0 h4 [' U+ O- m' ~
( J1 t3 ], [( S0 _9 K+ o8 g
( t$ D# N, F/ K" j4 E
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4