嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" @5 `, o& `. i4 `1 H$ k
' Q( @# [/ q- z* c# @9 E
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 b) `+ e4 v2 R0 y5 ^+ U8 R
#include <unistd.h>
% x6 K, U+ @6 ]% B, }. ^; Q0 i
#include <sys/mman.h>
% O) y' A. h. r. a7 j: U: n# s; }
#include <sys/types.h>
) _; X* V, d, b% P* S" `( I
#include <fcntl.h>
+ i2 j. W4 Y- \" e! O2 o5 K
7 x. K% X1 d& |( @1 N f+ y5 L/ w1 W& S
#define SHAER_RAM_BASE_ADDR (0x80000000)
* c: }0 ?6 L, s
% ~- P; w# t/ w' ?9 I
typedef struct
/ \& }/ `" H7 i% S
{
3 O- ]8 g8 f$ F' J+ `
unsigned int a;
# _: @3 |8 C0 `
unsigned int b;
& U2 O6 J% C" K' _: U! e& e
unsigned int packet_cout;
3 v2 _1 u4 P) m3 t1 i4 H }: l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: X$ h, |* y, Y6 F7 |( R) i
7 y9 r& n/ a! z6 u1 s. ?/ G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
% W6 s; H: a! b$ j; B1 p B
unsigned int count_copy = 0;
% q- r6 b8 t1 f, Y4 l) A. u
% l8 Q9 | K) p
# @3 ?. h4 W; c. K7 m
int main()
! b0 T2 i9 t$ B$ N
{
0 \2 d: O L- w/ I% e
pRX_MSG_PROTOCOL pshreRAM = NULL;
7 V1 |1 O0 h, W
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! e% P! e: D4 g
7 c- Q" T" X6 B& x
while(1)
6 D( Y* X4 Q" e4 I5 ?
{
+ x# s& i$ h0 v( ~8 D' a, v# U: i, @/ t' y
read_MSG_buffer(pshreRAM);
* b; c* o" J" o6 H3 a( F" l
}
6 t( q+ H% h4 m. K5 M
}
; M, o. Y; C1 V0 T$ q8 I8 k+ H
3 k+ w& A7 `" l( s H3 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 b6 B G" m* b) C
{
# ]1 }& W( y- g
RX_MSG_PROTOCOL buf;
) L$ |4 ^7 l6 |& n
2 `, l2 n, F1 f. P7 w
buf.a = pshreRAM->a;
6 @" p- t3 `' x2 b/ N( d1 ~" B2 t1 ~
buf.b = pshreRAM->b;
9 I$ q) G1 ]6 W3 q
buf.packet_cout = pshreRAM->packet_cout;
5 P6 M' _/ k2 }1 c
% u* n+ O R# X
if(buf.packet_cout != count_copy)
7 h0 x7 a1 ?( A
{
: x8 ^: K3 a8 E# G1 B
printf("a is %d\n", buf.a);
. { V5 i0 g( `6 W
printf("b is %d\n", buf.b);
6 t; z/ V, P) L$ R+ h: _
printf("count is %d\n", buf.packet_cout);
* X* c! D2 p, p) A' |. n
count_copy = buf.packet_cout;
' V+ |, H, a' T, C: ~* A
}
$ O4 c9 i. z O9 f
else
; a+ B5 \8 C5 i" g
{
$ f7 t# y5 ]9 t' O9 Z' k; M! J3 C
printf("No effective message!");
3 ~0 z9 W |5 m. S
}
: ~" G% A$ k5 T, y: O0 y; U% z
}
% w; I3 i/ {3 ?& R) L0 ^
5 T& q& o7 n# _0 l
5 k6 d! P3 x1 p3 J! L: m. q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) D7 ^3 l- }; @7 i) z/ A' x3 G
使用下面代码,对内存使用了mmap函数后:
2 ~9 e0 J/ L8 S6 D% I% T
#include <stdio.h>
( I+ O; f9 s9 h3 ~* j
#include <unistd.h>
* q; ], W1 s0 ^* b+ r6 p
#include <sys/mman.h>
2 u' F) B$ U4 B
#include <sys/types.h>
1 C9 N2 [/ R# l" P
#include <fcntl.h>
+ \! w& u! ?, t
/ p9 B! {( X0 I! n2 ~
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 h$ _) h6 s3 @
#define SHAER_RAM_SIZE (0x20000)
& y0 A$ v: K+ o: p. }1 |1 U; C
/ r) W* S' n' Z: g
typedef struct
$ Q6 t# I/ D" Z9 U
{
( H2 W' U3 N: [, L
unsigned int a;
" r4 ^0 _# I3 C+ p
unsigned int b;
2 ^% J" R3 p2 f2 [4 C7 I1 }
unsigned int packet_cout;
4 [7 |0 p4 ?; X2 Q# z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' Z3 M, F6 P. b
" [' N1 r& u, w
void read_MSG_buffer(int *baseaddr);
' H$ O" r' m; v. y; E
unsigned int count_copy = 0;
# D1 i* O9 Q: J/ D6 Q/ R
) H$ R5 c' f9 n+ Y5 H& \1 i+ E1 S4 U k* B
int main()
& ]2 W1 j8 ^" G) f4 u! l6 M
{
7 _# u. t6 J/ r: R% E" R
int fd;
9 T- ?8 Q+ w- c ?0 q' X5 n1 e
int *mem = NULL;
) _; V6 l' `& |5 C( X1 |" M
; Y9 ~) g* ?! A$ ~
if((fd = open("/dev/mem", O_RDWR)) <0)
3 M; o: G: Q, {$ b4 {
{
2 s1 r& H$ O- z, s
perror("open error");
, I9 c% p: w7 V: ]/ T& s( {
return -1;
1 O X# `% x6 Q
}
( j6 L: l3 M3 W; T: U7 c7 F }- F
+ X' _3 g p( l1 X
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- L2 O- y9 P+ t9 e% K
% B1 H3 q, ~* l7 Z: h7 f& \7 ~3 E
while(1)
# b& w" D8 _% e& C$ x8 d! Q
{
7 b1 |: K; k ]5 G9 r
read_MSG_buffer(mem);
8 G7 T9 \+ ^( [7 f" ^1 K
}
% L( W' ~9 y, h4 N$ [
}
, B& t( Q O- l9 x2 M
' E' T. z: s3 X! @
void read_MSG_buffer(int *baseaddr)
6 w' {3 S5 Z( d; Z
{
% b5 S' v* Y/ _& {/ Q
pRX_MSG_PROTOCOL pshreRAM = NULL;
# U$ F, B9 R& X; k' r/ z
6 D" a* z$ O$ M# y, z9 \) S
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ J9 ~6 J0 d7 i& Y
7 g3 g. X$ g- |# ~9 F H/ e, V0 M
if(pshreRAM->packet_cout != count_copy)
& }7 A8 w7 g. F+ Q0 d. _% X* a# K
{
0 z% _- S0 |4 y
printf("a is %d\n", pshreRAM->a);
3 f' R' z4 F1 m4 K) w* R; R. W
printf("b is %d\n", pshreRAM->b);
: v' k: w1 X: K
printf("count is %d\n", pshreRAM->packet_cout);
5 _" A: M9 W3 [' `4 f- Q
count_copy = pshreRAM->packet_cout;
- T7 Q' n7 K( e) T7 {
}
+ A2 e- G' M" q0 G( z) v. U
else
2 Q( e+ Z0 I( M* ]! y8 Z: T9 R6 `2 Y
{
$ \$ z2 f; B6 |6 \+ h- [
printf("No effective message!\n");
1 X3 }6 ^5 G+ j0 v9 I
}
; c/ q$ g+ S' G0 A) C
}
, g7 w3 F( l7 P6 w
9 X! S" H+ P- t1 a1 u
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, g8 M& m5 Z" n) j2 ?. S4 C
" W* ?9 K* L: b+ Y. u* g
* H, u- ^) e6 x2 d" v
- ?: H) N) a$ B6 B3 z& y9 b- G
/ s& C# J: ?) |- g! ?4 h1 C
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4