嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" k! L9 W- D5 O9 ~3 r. v
# S* D( ? h, p2 j' W' _7 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! L; q3 C8 f1 ^
#include <unistd.h>
0 ]2 W! i1 \# o7 j
#include <sys/mman.h>
2 ^4 e _, I/ r: ]5 k6 B
#include <sys/types.h>
' @3 |" F$ y S9 X* W( {5 z) Q
#include <fcntl.h>
1 ~' M+ O; z/ g/ [
2 [) Q6 {+ |9 ]# N! R& }
#define SHAER_RAM_BASE_ADDR (0x80000000)
: f4 ?% P! Y; i6 o" J6 w7 `
8 }" f, d, f* p1 c% {
typedef struct
% i, m- P- G$ p- W5 `9 \! Z" z: ]
{
4 }0 S. p" }: J4 i9 L$ Y( x
unsigned int a;
# }0 c: J# r& X6 q
unsigned int b;
0 N2 S1 s! a- y4 s9 s8 C) k& i- V- l
unsigned int packet_cout;
2 n- e+ o1 w# \4 i6 l& L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% T6 x! G, w& V9 a; ?" |! c
; a1 f. L' Y; B( O- ^4 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
R$ v# k; h8 K7 ]) w; G
unsigned int count_copy = 0;
# P9 O c7 a. Z1 a% ~
4 c4 D! t; r/ q/ \: u4 j u! s
( Q. C& r* c9 ?4 K$ ?/ G& l9 m
int main()
$ e' \! R, K" V
{
& ^& |3 Q* l$ T# \% }/ K4 j5 d
pRX_MSG_PROTOCOL pshreRAM = NULL;
H$ F X1 w$ J
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 Z# O/ A9 u8 p2 b. N4 `; x& h
* w! y6 }$ ?$ C: R; `
while(1)
+ s; k( K% w, E+ [
{
/ O' i3 R. F# P
read_MSG_buffer(pshreRAM);
; ~+ ~% [9 g& y' L4 S: a% N1 l
}
1 Q3 @. @$ [" s" N: ]$ M
}
+ u. R" c# \3 o8 h3 s% W* N
2 g& I! i; _9 d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 ]- m" V0 P# E3 j- X) f2 T3 t: }, _
{
T6 j i' c. d
RX_MSG_PROTOCOL buf;
- i4 d$ `* |. U% t4 p
8 w: l2 S3 q, \$ ]2 o8 l) P
buf.a = pshreRAM->a;
* E. R$ \! `# P/ \7 z# f! F) R' w6 J6 o
buf.b = pshreRAM->b;
; U2 k( K* P6 p, ^( p
buf.packet_cout = pshreRAM->packet_cout;
- b) L6 @; o# I/ [
: A% [$ j8 i% S( R1 z( I! N+ Y% l
if(buf.packet_cout != count_copy)
; ?$ x; V3 B: T: T
{
# Q7 N @/ P8 b( q
printf("a is %d\n", buf.a);
% m. }3 J! \. v: Y9 U
printf("b is %d\n", buf.b);
: M5 E, N: f# F1 v; B
printf("count is %d\n", buf.packet_cout);
x% n- Q2 J' c. @8 X1 z
count_copy = buf.packet_cout;
8 s3 _; q- e1 X4 z- l0 Z
}
4 a$ C) S; T7 p4 t$ I1 E5 h
else
V4 B. m9 {$ {$ N* X
{
8 `: L7 ] ?7 m0 k0 T
printf("No effective message!");
) R# P) {$ B0 n" \+ }+ Z
}
e4 y( n2 l$ r2 R4 x2 ~! A
}
2 e1 z" O# k1 }
: {/ D- S% R- i5 z2 D* {9 |2 C
9 J3 b" c2 e Y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 O M) p; C; J8 _9 }
使用下面代码,对内存使用了mmap函数后:
$ Q* ^: ]- ] i$ |( Z9 E/ R
#include <stdio.h>
0 G! a" `/ y: |) O" y4 h' W* {. q
#include <unistd.h>
, b/ s; A/ I- b" E8 f
#include <sys/mman.h>
( T! Y5 t6 |9 x, s
#include <sys/types.h>
`# q- N) c) z1 w' g
#include <fcntl.h>
" E9 o5 X7 q" n2 |
& H8 \, O0 r: K$ w6 b
#define SHAER_RAM_BASE_ADDR (0x80000000)
; R" k( m7 |" a& n% {( v) K
#define SHAER_RAM_SIZE (0x20000)
3 E! r- Z9 g# Y8 X% X
0 G$ l h' Z; @) I' _
typedef struct
. G0 [8 V' o0 U( ]! v! @/ X/ F
{
7 g3 |& \# `6 }% m
unsigned int a;
( Q* |$ i7 N% d% H# Y/ N
unsigned int b;
' B6 C: R1 r( K M0 j
unsigned int packet_cout;
0 l0 V3 Q* S# T& v, m K0 {6 e: `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& U) g( h) m* r7 m' T
1 s, H6 m* t9 J. a2 w7 b
void read_MSG_buffer(int *baseaddr);
, L+ V' c1 U+ L5 q6 q
unsigned int count_copy = 0;
% {; D. x, ~/ v- u' E2 _8 J9 f
; D f" _7 y( [& y9 \0 r
int main()
) o: S) n1 t- {
{
s" q8 }' U& C% r, J
int fd;
+ c8 P% _6 p* x0 S* q K$ z2 a
int *mem = NULL;
, W+ b6 R# g+ l' [% l
% t: Z3 w, Y7 x. |
if((fd = open("/dev/mem", O_RDWR)) <0)
9 {: `+ v* C G& L2 Q- ~5 z
{
7 U. z- c+ K3 C) L+ R ]
perror("open error");
9 o! y% \; x, {0 x
return -1;
2 S- F- a& u, D( x
}
3 B8 q" b# ~* o- P7 o
9 @+ i$ F' O6 e$ J
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: k( o! D+ A8 Z7 Z5 [
. o" s; X5 u% V8 c( l6 [
while(1)
4 x6 q; y$ D0 i* K3 q5 J5 }/ H
{
, @3 \; A% V7 ?( e7 D
read_MSG_buffer(mem);
: t4 U( ~* }+ b' M" ? E
}
# W" ]* h+ Y' R/ k
}
! {0 Y5 R: ^, v' K% K9 l" c
# i( d1 i- `2 Z" u0 Y1 T7 x! l' o
void read_MSG_buffer(int *baseaddr)
4 o; o' d+ o3 C" { E/ L
{
/ |4 L1 ~ t9 T1 c9 C- }
pRX_MSG_PROTOCOL pshreRAM = NULL;
4 n; B# N; K3 }
. `, t1 S L" L2 @0 d. ?+ E
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& x5 u c; M/ G$ O
5 T+ c' n- h! j& x$ { d/ r$ e' R0 `
if(pshreRAM->packet_cout != count_copy)
- l1 |! I4 l+ p. K* B2 m
{
6 A: ^/ J# n% U5 R. x8 P- ]
printf("a is %d\n", pshreRAM->a);
( U3 G. b" ?) E
printf("b is %d\n", pshreRAM->b);
, b7 k Y& {; Y- F* \! f& s3 M+ W
printf("count is %d\n", pshreRAM->packet_cout);
% Q2 u7 T# U8 q9 ^2 ^! B
count_copy = pshreRAM->packet_cout;
+ ]- a9 v8 Z3 F# k" W
}
6 |, Y* q% p3 @/ D
else
8 u% j5 X! }! T" {& Q$ ~, \6 K9 J
{
8 f# S9 G/ p+ n* w
printf("No effective message!\n");
7 e( X5 N$ T! Q/ v7 i: y
}
! A" A$ q! X; r; a7 W' i. e$ ` E9 r
}
8 `9 T: b' [- D5 H5 e
3 F- r( d$ C* k3 G f3 ^6 {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 y% z# K; b2 ~* b! L
) ?0 Z) n: j; ?
5 D( o+ @4 U0 d, K$ b1 [/ b- u; u
" {+ _- F/ z) [8 r
: b* {* N3 o& s( v! G' i+ `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4