嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' \$ r$ [' m, z) p" x, R! V
4 g$ F8 I$ ]2 J. X
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 E2 c2 i9 W% P
#include <unistd.h>
* @4 \" M7 [/ K* m. z
#include <sys/mman.h>
5 b% x* k+ r _: U; F8 I5 J$ ^
#include <sys/types.h>
: z; A' d" B! h1 ?8 i
#include <fcntl.h>
6 F9 y! a: ?1 v3 W4 b7 t8 h
- i& S6 m1 h% {
#define SHAER_RAM_BASE_ADDR (0x80000000)
9 D8 e8 a! H! Y* i6 I( b8 G, K
( `2 @% d# `/ Z' R( S7 x% _' n
typedef struct
' @5 @" S, T' M8 b4 ~
{
1 n' l4 z2 }4 u$ h
unsigned int a;
; |( j! y3 t" Q1 ], ~& @
unsigned int b;
* }* B2 o1 V6 S: V, E4 ~- }1 V5 e5 y
unsigned int packet_cout;
; y, o+ x+ F- t4 P# t# v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 U( j% i& Y3 _6 a6 u7 ^' O
( v# I S6 K7 \: }7 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 z6 v4 m# [" u: h4 r& ^
unsigned int count_copy = 0;
8 m& L7 f- q* s3 e$ M
9 n) i/ P/ |9 A1 D& E! ~( J8 I
1 L/ S' I. W! g/ J+ v% z
int main()
1 t7 b9 z% r4 G" K' ^& L
{
6 U& [& J; T. V
pRX_MSG_PROTOCOL pshreRAM = NULL;
' F% {9 `) I5 x: L$ p
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
& X. g7 D2 L' F& X9 z* X3 O
$ q5 t- k& m. M6 ~$ z2 m+ v
while(1)
/ \5 [. R7 S$ ?9 E' A
{
% @8 h0 t, Y+ p& [6 L0 D/ k7 C* A" m
read_MSG_buffer(pshreRAM);
& b0 C3 @! j+ y4 p: `# L7 S9 s
}
5 O) w" n: k9 b! C4 A2 E, R* O1 I
}
: o2 e% e" u7 O, b0 r
1 q* @- ?9 [$ n1 m/ U2 e+ n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% O! k* T, C0 @% F z( I2 z
{
, o& Y- e2 s8 D# q( Y1 ]
RX_MSG_PROTOCOL buf;
. O' C% F5 a, E% u. D8 ~( c$ w0 C
; L* k# l ?, h \+ w! `1 u3 l. O
buf.a = pshreRAM->a;
; V, y# w* V5 ~% x! c8 G: M5 [" n
buf.b = pshreRAM->b;
: n4 L6 @1 P& ~0 K
buf.packet_cout = pshreRAM->packet_cout;
4 d/ @' I5 i& T8 n) V' M
" k0 F# v. c$ C6 U
if(buf.packet_cout != count_copy)
! E# H& [9 P( O/ J4 E& |# G5 {3 \
{
9 ], s, M4 h9 N+ Z
printf("a is %d\n", buf.a);
# b, t- p8 F, j1 d
printf("b is %d\n", buf.b);
0 i5 Z! A! G! W* E! }2 d
printf("count is %d\n", buf.packet_cout);
9 @3 d8 X; p4 O6 i
count_copy = buf.packet_cout;
& f9 t2 r0 D8 y0 Z% v N H
}
h! I& P' M5 K! z9 F3 A
else
$ `, a4 L1 n5 E$ G9 m7 u
{
8 B: r1 @6 F( H
printf("No effective message!");
0 Y. K& l6 v0 ]* O
}
- G; a0 f. k& J1 h8 N% g" ?6 ?
}
8 W3 c" B, j7 \! ]$ y
# ^) G1 T, Q3 L. Q( `* @
F& I1 ]" F! {* I7 l$ X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 p# @) j7 O$ y7 u+ Y! A4 r
使用下面代码,对内存使用了mmap函数后:
2 y; e6 r* I* ?0 r9 x' a2 @
#include <stdio.h>
( x4 c9 p$ \% A$ i1 J2 i9 ^' f
#include <unistd.h>
9 y1 h) _* T! Q8 a) h" o! u1 s
#include <sys/mman.h>
( }) t: k* X) [6 J( O
#include <sys/types.h>
3 c4 J% ]5 }8 f" N+ Y* h% U0 l) c
#include <fcntl.h>
$ |0 w$ @$ t- [# z) ~. j
) Q6 \) _9 X" w$ g( S
#define SHAER_RAM_BASE_ADDR (0x80000000)
& i' |; T6 F2 _( j$ D
#define SHAER_RAM_SIZE (0x20000)
& R5 j( q, M1 q) u# s; c; k# A
" [2 t) w- I5 Q5 y5 m) h) b& b
typedef struct
$ p& v% {$ a" ^# N; G& M) v" R
{
! Y% Q& Z0 U& X; u3 L) C
unsigned int a;
3 k2 v. j2 Q2 K
unsigned int b;
: v7 @# ^' c' m% E: u
unsigned int packet_cout;
9 f$ { |' S: V# C8 a8 ~" P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% U# i$ ^" Z( C- B
. r2 x+ F' L5 t1 R; P Z
void read_MSG_buffer(int *baseaddr);
* L3 R4 o' L* j3 X
unsigned int count_copy = 0;
& Y8 }% Y7 z8 k' p4 x
' [8 ?1 ~4 x* V' k
int main()
2 _$ ^( [1 F4 }1 }. l
{
. \1 @5 M% W8 t
int fd;
, K5 X' x& c/ k4 N
int *mem = NULL;
% X) T$ C+ X6 O) {, J
4 I6 s, }3 L/ Q& n8 Y2 j: _7 d% q8 N$ ]
if((fd = open("/dev/mem", O_RDWR)) <0)
1 _7 S" o3 G) ?
{
7 G/ J& ^1 F' J( j
perror("open error");
* x6 v5 K& C/ V) q h5 [& }4 D& z! S% E
return -1;
1 z9 A* t1 f, N4 W
}
8 s; h. v7 j. A8 a" @3 ]
" D/ g J* D9 `: [& }
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 m }5 I5 X% Q7 ^) \
8 c: U' A) \# m/ g w
while(1)
6 c5 t+ h: t& K% j' D$ @! }" H. v
{
8 V7 P, X9 w) P y) p$ W
read_MSG_buffer(mem);
8 g: W, W! x) n% H5 }8 A) G5 @1 F
}
; U0 [, Y7 w) u) j' B e
}
+ f: L* A7 l3 h3 t4 _- ~7 R
& I' ]- c, V+ F: M* w
void read_MSG_buffer(int *baseaddr)
3 v2 a d! G: M0 ^( h
{
2 |6 ^5 G8 n/ S! j9 @ \8 ?6 f
pRX_MSG_PROTOCOL pshreRAM = NULL;
0 |* f R& M& O
8 l9 T1 m& O" b: g
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 ~( c6 d* Y: W# y/ L
* b- p/ H% l7 ]9 s7 |
if(pshreRAM->packet_cout != count_copy)
7 N1 K* e0 \% _5 C
{
- u+ N( }" R! r; K% M- ?' c
printf("a is %d\n", pshreRAM->a);
: I5 t2 M& M' {( u# E$ B
printf("b is %d\n", pshreRAM->b);
( `3 K5 _" q+ k& W5 k5 C
printf("count is %d\n", pshreRAM->packet_cout);
~* @- W: ~8 y* A- e! u
count_copy = pshreRAM->packet_cout;
4 p( f& K/ u& g) d [
}
9 \0 [$ I; E. U
else
' _6 G9 a0 J8 Z j; F7 A
{
, u d/ F: M O# m1 k$ p8 T
printf("No effective message!\n");
. f' Z2 i. N4 R$ V
}
+ [0 K) @8 A6 }; V. Z* ]
}
0 Q. h% n0 U# B
: R0 a$ d2 I8 Y* s* D
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& n6 } N! _2 i+ i
$ D* \4 F; m/ @. V: T! T, w8 r/ E% w6 e
% ]$ w1 V* a+ m; C) J. b8 k: @
0 p. W+ V* [" J: |8 s6 }* Q
+ B: x% n1 E% B' H9 H
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4