嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, T, S2 V1 W- C3 i9 l+ n2 N& l& D0 J
2 U$ Z- b9 _4 g! Z% l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 @& v/ [$ |$ R% y0 v: g
#include <unistd.h>
& I; \2 p' ?6 o" K
#include <sys/mman.h>
) N, V3 i- p# s6 q Y9 E( }- ], D' V
#include <sys/types.h>
* A3 B. V9 p2 }* U% Z
#include <fcntl.h>
3 C; S B: g) x
1 K7 D) T% B+ Y1 Z1 R
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 Q/ H7 P. y S* ^- o2 X. P
* ^2 ?' x {' r n* {2 H
typedef struct
% I5 r, L* o& p0 L& G2 \4 i6 ^+ T
{
1 x1 J! p; y/ ?: u8 S, U7 z: |
unsigned int a;
# [7 _: X2 M4 v. C/ V! r
unsigned int b;
# A; L9 w$ J7 P7 [
unsigned int packet_cout;
" }4 k: R2 W7 K' R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; B+ W" q. s9 C# z
! D% O3 x- x0 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
f! Y' E4 r) r, w
unsigned int count_copy = 0;
7 s, o g/ |' n, y
+ E* j$ z- ]$ M4 x
. [9 U+ U# ]% L5 S2 ]4 E% s
int main()
& |3 L# d: |, v3 c
{
9 Q8 L! C9 o" K' x
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 u0 O4 ~( J& r- a' K& D
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( i" K4 g9 l. ^7 k3 M* N% X
: U3 w+ `4 e$ e/ i: G4 L
while(1)
5 Q0 M( I4 D: u9 ~
{
+ d5 M; {! q0 U& n, N3 K
read_MSG_buffer(pshreRAM);
+ z; q6 j% n: L1 I6 r& |
}
. t% E4 K' a v+ f" @& e8 Q0 }
}
" j F! d' e: W2 X Q( q$ k9 a
$ c1 k3 Z0 q7 ~0 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 j3 B2 {; {3 I, Y9 x) {4 T0 c
{
* ?: w! N' e: O q z
RX_MSG_PROTOCOL buf;
7 m+ L( K: U/ I, t6 {5 h- F6 b# ~
7 F1 T2 \' x3 Z" V$ c4 ]/ o3 {+ e
buf.a = pshreRAM->a;
: l: X! v( M" \. G" J, E
buf.b = pshreRAM->b;
( j! G% l9 M0 H ?6 L1 {4 a
buf.packet_cout = pshreRAM->packet_cout;
1 t+ X6 A, h' o& }8 J7 [6 \
: `+ O: k$ I* p1 o0 b/ ]5 E) L; }
if(buf.packet_cout != count_copy)
' U- n" s3 V% W% I5 s" n
{
/ R* k5 [' g4 S9 K" C
printf("a is %d\n", buf.a);
}8 Y1 a: c) \# a2 o5 _ v
printf("b is %d\n", buf.b);
2 @8 l+ K) x& A5 Y( m
printf("count is %d\n", buf.packet_cout);
% m2 ?1 {6 q& r* d+ O5 v% }( a
count_copy = buf.packet_cout;
7 G& C% U& }' @( Y4 U% ~
}
" W+ a3 \, Q$ H: t
else
" X3 Z$ S) Q+ ]0 W
{
% Y, n( b) B! o4 J
printf("No effective message!");
& V7 `! W( l# p1 Y
}
3 z/ {! S# s1 x/ W. ^: ~3 P
}
3 e; R1 E( y# z5 I4 N1 T! g
! ?/ P0 b- G# x7 H3 W6 I
! R, e( `3 i1 {2 E4 [$ S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; N( u6 D( E( X, b
使用下面代码,对内存使用了mmap函数后:
% f4 }) T) _1 L
#include <stdio.h>
# D8 Y% P6 N. p- c% y! i# }
#include <unistd.h>
& k1 q; ^5 T# S# G
#include <sys/mman.h>
. q+ l; t" y+ o5 n+ ]
#include <sys/types.h>
5 l# |" |6 A% g; Z: \' b" q
#include <fcntl.h>
6 h& o0 q. V% G" l' B+ Z4 I5 K" i* t
( \ a" g% p. X C# w2 Y" {
#define SHAER_RAM_BASE_ADDR (0x80000000)
2 \5 ~1 V' {5 X5 H( o" J, y
#define SHAER_RAM_SIZE (0x20000)
% C8 }% ~ Y/ M5 u$ ^/ I
. [7 b& g) d1 |3 [# T5 u; n& p
typedef struct
1 C- G+ v+ q% [8 i8 A9 ]% r
{
) d8 \' t2 G% F
unsigned int a;
& V5 C: m( Z) k( _) g, Y: i
unsigned int b;
- A) P3 \" \, K9 G* p
unsigned int packet_cout;
Q. }3 L3 K) c. c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 d8 C, u* F0 i: [ D
& X8 _& m6 G2 z8 q
void read_MSG_buffer(int *baseaddr);
9 x1 M7 W5 H- z
unsigned int count_copy = 0;
4 ?" q2 C) Y3 V/ L6 g+ a; ~, x- [
6 j% x+ J. K. q! q; l
int main()
# _& X3 n# o6 q# n' d" Z
{
* V7 R1 |2 r4 E) R0 Y; m
int fd;
' ?- W a* o- v0 v
int *mem = NULL;
7 J) j8 i8 g: A$ u+ N' Y, m2 ^
7 I; E* \" g! `* o9 N" e! T
if((fd = open("/dev/mem", O_RDWR)) <0)
. B R5 q1 d3 a0 k" X9 ~8 k+ v
{
. T* ?) O: o! L7 [
perror("open error");
$ }* l1 ^5 l( `+ F7 M; {
return -1;
9 B, ?4 N. f/ I& y# W X# b
}
+ E3 j# b) E: L0 e3 `8 k# P- }% j' W1 ^
) K* E0 a+ @' n% u
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* i9 h1 i/ M( \8 A! w
2 f* o6 |5 q. O8 i( _6 h
while(1)
2 S, i9 A& I: |* i0 y4 [
{
1 r# B+ L) ^- {5 ~ s! u
read_MSG_buffer(mem);
0 X) g% l1 t; J
}
* Q+ @ b. u4 c9 O
}
6 D& s+ Z8 u2 j+ n
' G9 V0 \1 M6 X' A
void read_MSG_buffer(int *baseaddr)
& K, y3 k7 ]/ u4 t" s$ i
{
/ T3 u- e6 w4 b' D" s6 O3 Z# Z* L
pRX_MSG_PROTOCOL pshreRAM = NULL;
. Y E6 {0 X8 S* X, t* Y
9 B$ W- v" R6 A+ V- k
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 D+ h. ~3 `: S; j6 J
# i% n: f: P7 |
if(pshreRAM->packet_cout != count_copy)
@& _" G( Y2 n" I
{
7 j" p- ]0 S. x- Y; X0 x [
printf("a is %d\n", pshreRAM->a);
! @/ J1 H( ]0 l
printf("b is %d\n", pshreRAM->b);
# D6 L# F- }2 _% j2 D z4 }
printf("count is %d\n", pshreRAM->packet_cout);
- ^2 `( J# B. p$ m
count_copy = pshreRAM->packet_cout;
$ n; c, X2 L4 s5 B" I
}
- |0 z: r" {0 [0 D! n
else
2 N+ l( p2 ~, i2 _
{
) V6 t4 m! G! n0 M
printf("No effective message!\n");
" w( G4 w$ t# W
}
0 n% c& U" }4 v" b, B. W' w
}
7 n4 q! r# ? @6 i
3 Z7 o) h. J, m/ @
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 n! u# q7 _4 |% W% \8 o
+ R8 H$ L) A+ q" k
1 {3 ?) x) ^* \8 {& Q
2 n3 [8 P( Y* l8 h- e/ r
/ B8 I) v- K1 M
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4