嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ z9 s7 R, }+ i" A2 V
) U4 K) D$ S2 [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 [1 O" t* s/ D% p% [
#include <unistd.h>
% j1 ]3 l8 V7 e7 h; O o' Q# t; c
#include <sys/mman.h>
; o3 z, M5 m% e$ G" {& g X8 }
#include <sys/types.h>
3 f: N8 ]3 c' P/ g0 s2 g! x+ }8 {
#include <fcntl.h>
, p/ R5 d( {# A4 ]: P. M
5 `3 V/ _' n5 S: }* V
#define SHAER_RAM_BASE_ADDR (0x80000000)
1 p5 e, m+ o7 `* _, b' \6 p2 `; b% @
4 q* |6 c+ H4 U9 U+ R
typedef struct
/ c$ n6 x0 I# n' b( H
{
7 k# o0 [# z o2 `9 i% N5 G8 R
unsigned int a;
7 T) {* n- H0 p k6 l
unsigned int b;
' H7 M- V `5 o+ n& C* T
unsigned int packet_cout;
8 p( u2 i) l# O
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 m1 N2 s3 C" @# P2 X- ]9 X
4 a3 P& H* D q8 Z0 O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- H) ~+ U% a! S* Z
unsigned int count_copy = 0;
1 \8 q% K2 R% N
$ L z" n. o# ~' |% [" L+ T( n
' ?! d& m* {& ?2 z* W/ b5 x
int main()
- t; V; x) g, C8 h5 ^
{
9 e9 o# A; c! V/ O4 P# O
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 P, F: d* }6 E) a
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
6 Q) J0 U$ b, i7 r$ y
2 e0 ^8 v" V9 A; C
while(1)
6 b; R7 c: R# \. O% y
{
+ q7 `; ~) Y' B* k6 q; e+ @
read_MSG_buffer(pshreRAM);
l9 |9 q; O* m, U; I+ ?
}
, F+ O+ f4 I$ {4 k) }( b; w% X$ G
}
8 q9 @0 Y1 [+ \& `7 i4 D
% J& ~5 A* B4 b9 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( {, l! q" s) ]' _9 e w9 o
{
6 q4 ?* o9 y9 M0 {: ~4 c
RX_MSG_PROTOCOL buf;
7 ~& N& |2 [3 Q! J$ k
; H1 b% `0 y& T, w( f. P: z
buf.a = pshreRAM->a;
7 ~# W4 o) `7 g( i
buf.b = pshreRAM->b;
$ i/ y# P9 G6 t0 Y: L
buf.packet_cout = pshreRAM->packet_cout;
; h3 T% P, J' u7 m5 u& U/ e/ l! M4 y
5 `# g5 K2 @8 f; A$ u- o- S
if(buf.packet_cout != count_copy)
+ ^8 E1 r! l8 t4 Z, ?
{
`- }3 S R, w6 Q: Z
printf("a is %d\n", buf.a);
8 F/ b5 N$ F% U- h( g
printf("b is %d\n", buf.b);
& E' h/ y; f% Q4 ^' @ w1 }& A3 C
printf("count is %d\n", buf.packet_cout);
3 O- j# a( i1 c$ ?/ x2 G
count_copy = buf.packet_cout;
& H8 B6 J* \: B4 ]6 O( f
}
2 x5 @/ u. O3 O$ a
else
y# L9 r) q# g& k9 G) M1 I
{
2 \ d0 x' y5 A
printf("No effective message!");
# {: p/ W' C! y% _9 j4 s
}
W; s" l# H D# | p$ r8 p0 z$ J
}
3 c; U8 [3 k' _8 V5 L
/ t4 k6 G2 J6 V3 f6 g+ ?
! v9 n; f) _* x& T0 d6 D" J
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& |+ ^5 z% f5 f/ d! m( h5 [) r
使用下面代码,对内存使用了mmap函数后:
8 [4 V0 [+ o- L8 \3 R& b* r. q
#include <stdio.h>
/ \7 e ?$ x4 u+ y
#include <unistd.h>
- F2 {4 M( r% v7 ^2 P0 H2 m& r
#include <sys/mman.h>
b7 s4 L8 d; S2 o# \, g
#include <sys/types.h>
8 y6 C. K1 J/ s
#include <fcntl.h>
4 C6 H/ k# U0 K6 ]9 B, ?* t' ~
7 |( z, _ {8 h( v" a8 [5 n
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 `% K. }" W2 Y! c& M# W: W! f
#define SHAER_RAM_SIZE (0x20000)
" h5 k/ d% K4 [2 T( `7 t
: w8 |1 a' |9 d* a% f% f1 c! }5 m
typedef struct
: F7 } h/ |8 N% \* N0 N
{
) q. g3 q0 P9 G) T; w% h
unsigned int a;
+ a' ?2 W$ F2 b8 j" {8 ~) Q- G. x
unsigned int b;
$ j' i( M; m' H; N
unsigned int packet_cout;
* } F6 f& i a0 s8 ?2 _$ }3 P/ B; Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) n( _; w1 a# c) k
( l) [4 B% {9 Z6 E+ f9 B
void read_MSG_buffer(int *baseaddr);
: @* ]* f3 f3 A6 P5 @
unsigned int count_copy = 0;
# S( P7 d7 a$ n" u" ?2 o
! o7 n* B9 K! O4 f7 |
int main()
; `9 G; ^- E/ o" f# [3 t5 p- @2 T
{
# ]; _ A" j) j- |8 `5 d M
int fd;
/ B! T4 U3 ^0 B9 T
int *mem = NULL;
3 Y7 h- j3 e2 @. m
3 C, q# Q, e" s& T+ l4 }$ @0 X
if((fd = open("/dev/mem", O_RDWR)) <0)
, G! r" Q+ q' _ g! n
{
& l, d& V/ C$ B7 f) Y, T
perror("open error");
# j$ G3 X% a; W% e+ m
return -1;
Y, n/ F% C" g3 I
}
1 n- g7 o6 y E# V8 R. @
1 N% n2 |+ z2 K
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 c6 w0 Z- l! ]+ _
: w. a l, l& u) R5 }
while(1)
6 X- j! n4 b4 K, i' P2 b4 k2 E! p
{
5 P( m4 F' `1 u9 g2 Q
read_MSG_buffer(mem);
. ?* e+ v( o) y
}
. E1 { W6 G4 \; I0 @8 D
}
- J" E3 U5 G$ U/ l
" r# [5 E* v' l/ y6 d
void read_MSG_buffer(int *baseaddr)
. \4 g2 [) @* x: U0 H; z& x0 C
{
; j9 u# u' l, E0 Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
: l5 H3 B( k2 T$ |
3 O$ d! B) N% h8 r ^" Y2 w, o
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- X4 _7 P) k- R- P6 ~
" O$ n5 [7 ^$ B$ n/ q3 P
if(pshreRAM->packet_cout != count_copy)
: N& ]- f$ U: p' L+ L) e
{
g2 l; o5 x* A1 [! U' U
printf("a is %d\n", pshreRAM->a);
1 Z9 ^! R) v& Q4 M9 A# U$ V
printf("b is %d\n", pshreRAM->b);
0 L% p2 p( L. a9 ~3 ?/ L
printf("count is %d\n", pshreRAM->packet_cout);
& L+ E& w" R6 ~- P) [# F
count_copy = pshreRAM->packet_cout;
% W$ [+ q; b3 a) N4 a2 D
}
# Z9 C* |) r/ ]" s& _
else
) C n3 T+ V; [, x
{
+ ^5 {: `: V' f. V
printf("No effective message!\n");
( r3 I+ t; o3 y/ L Z6 k
}
( S+ ]1 @0 n$ @* G
}
/ i" t# S* r4 D1 \; b5 @% c& U
* `# F0 T- ]* s4 A4 I" r- v# z8 r9 |. q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 y1 n: q) U$ T9 s8 ?
2 [8 U8 e& G+ e& b, z, ~7 M* U
: ~* K# H' Z) p6 ^
3 [! b- g/ C( K
) N! U+ w; B# X
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4