嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# O4 A1 a9 ~( {4 x( L
% M7 L1 I. C4 Q" \# {0 P- N2 I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 H$ U3 T& {' N
#include <unistd.h>
9 `) [! L5 ]% I. i
#include <sys/mman.h>
! w6 K: A0 R! B4 E# o' Y, x' y- a; p! v
#include <sys/types.h>
. p7 o! ]% j7 H2 F6 Y! d
#include <fcntl.h>
0 R# V, B; q4 F: A2 V& \
! Z r4 C. ^, }$ A9 _& D# f6 o" y
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 |( Q$ x( `" N7 i
' e- S8 H0 e7 V# v2 X/ m
typedef struct
$ P5 r6 {4 W8 w1 {/ ?" Q1 M$ K' F
{
( h: X* ~7 v) |& s( y8 i
unsigned int a;
1 p5 N8 [+ I1 s: W3 _1 d2 P) Y2 U9 [
unsigned int b;
) o( ?. a C- T) p$ Q) S v
unsigned int packet_cout;
G: {: i- Y8 _" T# o4 k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( t6 b. N3 R3 z7 y/ d" r! d( ~5 f
' K1 z1 R8 m. f* M8 m2 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 }; | I7 ~1 H/ e
unsigned int count_copy = 0;
" v! e% m; o b# n! w# B
2 Q6 G2 @4 [* R' f, Y0 I+ _( q( k! ^
! t, A: ~; c6 j/ e' P% E# D
int main()
6 E3 e4 O* I- z- a2 T. t. i! G: j
{
, ~1 R5 u3 x& m) u
pRX_MSG_PROTOCOL pshreRAM = NULL;
! l5 {, y6 X1 N, c+ v+ w
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. N* G' s" @5 }0 z; S8 a
1 B; `$ H/ Y" C2 o5 X0 O
while(1)
! c5 l6 n: U4 F9 M
{
9 D& |( {: y. m
read_MSG_buffer(pshreRAM);
5 { B4 D, i/ I, {3 _
}
5 [8 T8 j1 I$ J; _; n9 p# Q0 @
}
t1 ]% \( y( o" w7 I* X; A, I
# k5 ^" }7 I' S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) R4 h/ o4 S7 D; p$ ^
{
6 Z& C& Z& P# `' E
RX_MSG_PROTOCOL buf;
0 o# z* Q3 N! D" N8 Z! o, J
; `" f- t& p; d% M0 H1 |
buf.a = pshreRAM->a;
) D6 i: ]% S# C! S6 G3 t" \/ E2 k
buf.b = pshreRAM->b;
3 F: W$ B+ P- q) o( {3 L) R
buf.packet_cout = pshreRAM->packet_cout;
( X9 A6 N: B6 O& q* A1 i' p
! c' G% }0 ]# U
if(buf.packet_cout != count_copy)
; h. S& M9 ^ V- B
{
" K+ f+ }4 @* Y
printf("a is %d\n", buf.a);
( P; y5 F: } d3 f: E; t
printf("b is %d\n", buf.b);
0 E' i# g4 Q" L$ y9 e7 @& E6 q
printf("count is %d\n", buf.packet_cout);
7 @ m, K6 n* R& a$ C* f( H
count_copy = buf.packet_cout;
8 X5 `7 W/ X- k* F! ?! S2 ~3 Q. E
}
' l( Z, I0 h( J( l3 e
else
8 W: D3 t+ Z# X* _, k
{
8 p) `/ P4 p7 |9 \# J; {
printf("No effective message!");
8 ^+ Z$ E8 p% j. w& C
}
" N5 F! V! t7 p! `/ R
}
, E; e" {. v, j, h1 [$ W& z
, Z: T0 K5 B( z) U2 w# C' D
1 W/ c2 B8 p4 _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; U7 R* `/ M. R! H: o5 s$ w
使用下面代码,对内存使用了mmap函数后:
0 y8 [. M2 L: Q# j6 ]- l
#include <stdio.h>
4 c/ `6 ?6 d0 s" n0 J Y; L9 ^0 K7 {( j
#include <unistd.h>
; S3 ~& C) y" C9 {
#include <sys/mman.h>
* q$ l! @: K4 g; v
#include <sys/types.h>
. M2 A1 q& s7 O ~2 S3 _1 i" x
#include <fcntl.h>
- |4 F6 T. A/ @, ?
+ @; W+ r% C2 a0 _9 F
#define SHAER_RAM_BASE_ADDR (0x80000000)
- X2 `1 V$ y3 [1 t9 V x; ]+ J j
#define SHAER_RAM_SIZE (0x20000)
1 }# f/ V- i; Y) B9 S1 a
' i- ]# D( T! j) ]
typedef struct
2 p& \, A" ~' @9 K( h& Y9 a
{
9 F( m$ s3 C, L& [) u. u% Z
unsigned int a;
D, x1 g( |0 T" q1 J. D, P: ]3 i2 S
unsigned int b;
5 L. X; d. o0 k
unsigned int packet_cout;
: f" d0 f$ b$ Y6 ?; B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 v5 T6 w+ H( o5 o5 L% n
+ Y7 X/ t5 ] O+ W
void read_MSG_buffer(int *baseaddr);
! U5 z p: X0 b5 V; A2 e
unsigned int count_copy = 0;
2 X/ j' ~7 i9 p
5 {, x6 Y0 [/ g* t8 a/ ~; @
int main()
* w- [( _8 m' `7 r ]- y! b" L
{
5 y! k Z( X9 [4 L
int fd;
. x+ a( l5 L. E; f& r) j7 V8 O
int *mem = NULL;
( }) U- d7 @8 g/ U
; A' H: h, M/ D+ v
if((fd = open("/dev/mem", O_RDWR)) <0)
0 h4 `* Q% ]0 Z' V
{
& v1 v" Y4 m- t. g" ?$ ~! ~/ j0 Y
perror("open error");
( r, ]; W+ p; Y# j5 Z
return -1;
: G. ~" H9 [0 m1 a7 k4 R9 _3 u( z" Q
}
8 j+ v' q$ y6 J# ]) \, I* D
: U/ T! D( w) q
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ w$ C7 T( e- B& r7 [) [
+ L% K ^# \. x8 W; j5 r
while(1)
6 @" n3 d( P& Q7 b! Z6 k
{
% }' F+ `0 K ~1 G8 z& D
read_MSG_buffer(mem);
' V# o4 j2 q6 w, J6 ?# \% h0 r7 }* k
}
* H Y( n3 B- e6 R, _$ W* g1 r
}
' D4 Q% |' G6 Y6 O
# o" F1 T! X% c1 C+ G
void read_MSG_buffer(int *baseaddr)
, w$ y) m5 |+ u4 R3 q# Q3 S+ Z
{
1 z. M% q* S& S4 l
pRX_MSG_PROTOCOL pshreRAM = NULL;
, e7 l5 ?# T% G5 V# g- X y4 t
% r% @5 F6 z, g; b' w* [
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- b* w8 _9 e. U! N" T
. d) i( Q; Y0 \4 u
if(pshreRAM->packet_cout != count_copy)
; L5 P8 Q5 A7 _/ ~$ p
{
k4 W8 u# E2 V1 [9 U
printf("a is %d\n", pshreRAM->a);
" k5 D! o8 T0 i7 {4 F$ _
printf("b is %d\n", pshreRAM->b);
: M" C* c( I# C, b+ \- s9 f7 Z
printf("count is %d\n", pshreRAM->packet_cout);
! V! }; ]! i& r3 e$ E2 r8 }# t
count_copy = pshreRAM->packet_cout;
' r! t( u$ r a/ s% F
}
9 E$ E: s& h! E- ?
else
; O- U# c1 X8 }, a
{
& `1 x" B; }& y, t' h5 a
printf("No effective message!\n");
( U f$ y% }0 @/ w: v- w% j
}
. e9 ~2 \3 I! P
}
3 n+ J% i3 F0 b- ?
. ~* G+ X( I" A
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% Z( }9 ^% u, z6 a5 w
+ {7 |6 F+ F# l9 }' k, G6 K
" `5 i& |( ]: h2 i9 m! ~
* a% o( h$ x5 }; ?# D1 N' `# \$ x" P
- _1 F: B' i0 P& k) b9 q
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4