嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 e* @3 F) j0 ^! e3 o2 J* T
, ]) ~( I% m) y7 X7 ~' v' v. x' S
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ x' t6 |% q" u( A4 f6 f
#include <unistd.h>
& M) ?: o- E, l
#include <sys/mman.h>
n" y5 F3 g5 a) S
#include <sys/types.h>
J8 N/ x7 t1 I3 n( K. N
#include <fcntl.h>
9 S: m( ^$ b1 S4 y- M
1 |, o4 s3 r+ A/ K, e
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 c/ R* j2 M- L5 d1 H" y
3 H" c! V" @. F8 Q3 ?5 A
typedef struct
* m7 ]9 c/ R) b" E5 m2 |, k
{
" g; o9 S, Z8 E+ s% x& o
unsigned int a;
) P$ E. F7 T+ C0 X9 M6 b; p+ I6 ?
unsigned int b;
& j7 \6 N4 Q& i0 @0 H" k1 R% _2 F2 {& w
unsigned int packet_cout;
& k; w5 G1 h, N6 ^( @; c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- p4 ], H6 {; f2 }+ _4 k
( W8 L# V8 a( z: }, V7 y6 m+ D$ `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) `& U, U1 I: B; O' M, E
unsigned int count_copy = 0;
& {* f5 F/ _* A, N4 ]
" M; A Y& w" C* s3 Q. j& l
* t y( G( t2 q, r. s
int main()
; L/ {$ k: E: R' C) W* g2 p3 k
{
# m2 j; Z1 V3 W5 b ~; I5 _" J
pRX_MSG_PROTOCOL pshreRAM = NULL;
" s6 X. _$ ^$ T: e/ ]+ ~ S- d
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 ?% d. X, R: o, v- {* q8 q
$ E0 `& x* X& M6 x7 w+ P) X$ F
while(1)
5 ~9 X4 {& k& n
{
: p& C' N7 q/ x$ ~. j4 l2 t
read_MSG_buffer(pshreRAM);
) j1 M M( a a2 S9 p) b
}
$ h1 m- {6 U+ ^6 A5 O4 {5 j, x1 A
}
0 C0 z4 {5 m& W e9 g: Y$ \ W
" a3 o* s+ b) _1 r# q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ T6 Y3 z' Q. y* t8 [
{
% p4 a% N$ T7 W* A# A
RX_MSG_PROTOCOL buf;
2 U0 Y2 G% j: e- e+ ]
0 x, Z) Y$ K/ k' _+ A
buf.a = pshreRAM->a;
6 g$ J; C, {, o
buf.b = pshreRAM->b;
H! R& y( J8 U. B# X
buf.packet_cout = pshreRAM->packet_cout;
! B, |: W: U, z( ]
, T% O+ y' T+ }" ?+ J+ g' z
if(buf.packet_cout != count_copy)
6 e% j: f1 s, Q7 U9 c+ o
{
" h7 g7 C7 b. t; z. F8 R
printf("a is %d\n", buf.a);
: N6 c6 S; Q6 j9 F: q
printf("b is %d\n", buf.b);
2 N4 h) T% m" k6 n4 k4 V+ I6 g0 W
printf("count is %d\n", buf.packet_cout);
1 K9 S; A! _9 E$ `( x; Y5 Q
count_copy = buf.packet_cout;
4 H$ e7 X& Q# r7 V$ M# k6 E% M% Y; b
}
! {6 Z @$ d# e* r; K
else
8 A3 }& [; j" U. a$ ?
{
6 r" ?2 u* k3 P9 X
printf("No effective message!");
, M( @ l2 m' p: n" N% Z& j
}
0 z4 C+ T2 b+ r2 m% \7 N9 F$ O: }
}
% D( u, w& A A- Z3 V
& y' T1 G X4 P/ |' o5 f
, W& e0 j/ ^. z, y* `" U n' J; I& y! l
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 q6 H3 X; f+ |" U5 @0 ~* A# x' B
使用下面代码,对内存使用了mmap函数后:
2 L" H/ Q- x9 c% M+ \; w
#include <stdio.h>
" ]9 ^' \/ r, k
#include <unistd.h>
+ C0 E/ o, J- {( T
#include <sys/mman.h>
x7 P# s( T( r9 e' e s& X8 x
#include <sys/types.h>
. L9 F+ J+ z5 I
#include <fcntl.h>
$ w# ]; S; i+ F2 G0 k& Y
, Q6 Q+ N% ]2 J9 p" f
#define SHAER_RAM_BASE_ADDR (0x80000000)
. {9 U7 ]3 O% r6 n5 M
#define SHAER_RAM_SIZE (0x20000)
f3 q, y; ~% A1 g
# I f2 G5 \! d' z+ C8 O
typedef struct
& ^8 { ?7 V3 i( V7 T
{
3 B3 K4 j6 b, q* t. t
unsigned int a;
- J @3 P# H! n$ S: T/ k! n4 U; i
unsigned int b;
! H# A2 o* p: x' V
unsigned int packet_cout;
1 W% a& }3 e8 H- _6 Q% _' w/ @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; r. @: h% Z- U6 i/ ^
; b" F, B# u ~
void read_MSG_buffer(int *baseaddr);
0 d* L7 e, @. G# B# s( [8 w' Y0 Q' w Z
unsigned int count_copy = 0;
! @# S7 n' S' |& N# J
" |% A7 l q: J5 j, ^( L, r
int main()
( k; q# P r, U' q1 \. H! y* [
{
9 t! t) `3 E) Q" B( J
int fd;
- |$ m n9 W2 {, `1 w0 J! ?/ J9 H
int *mem = NULL;
+ B* ?. g4 E# q/ h4 T
, n% R+ U: c5 S+ Z! _, v4 n
if((fd = open("/dev/mem", O_RDWR)) <0)
) `( M$ D) S; s1 G9 t0 D* U
{
2 |- m6 K( a) N5 Z& z. P4 q
perror("open error");
3 D! l+ N1 |- q: H5 l! B0 A$ u
return -1;
9 f1 L* \3 v- p4 m+ Y
}
5 \! w: y4 q1 N; Q' f6 z
. ^# ^& q+ K; j! Q: @' t1 k
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
" r9 n3 u* S) _/ J3 |7 o1 i* l* T
. s% |2 J& t3 {# @: V5 A# m& W
while(1)
" K8 z4 ?! p( Y5 W+ j2 U+ y
{
8 ]' X2 {5 {* k7 B) q0 T
read_MSG_buffer(mem);
& {) W6 B7 \ _$ q
}
! g* B* i. u3 |. F
}
/ _/ @4 _& u2 b" d+ Z
) x& {8 M! g& S
void read_MSG_buffer(int *baseaddr)
& g* O% M1 a. n# R$ o5 I% \
{
9 ~: Y* p( h+ q6 A8 ~6 P; `# b7 A
pRX_MSG_PROTOCOL pshreRAM = NULL;
. U2 A* B1 q5 T X: g
; \& v) N1 }" x4 c
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& s( k6 w) u9 D# S& f4 u, f+ b
8 E7 I" a" S! W+ i2 i
if(pshreRAM->packet_cout != count_copy)
$ V( j2 @* j+ w
{
/ w1 f, l5 z0 E I- o3 \
printf("a is %d\n", pshreRAM->a);
' @" p6 x3 D* [* y6 G E, W
printf("b is %d\n", pshreRAM->b);
& b ]) w8 a# Y$ P5 {
printf("count is %d\n", pshreRAM->packet_cout);
! D6 K( m. |& D& _
count_copy = pshreRAM->packet_cout;
j' I% e P$ U! W) F. i* H3 P; r- v
}
3 c% S' f2 X) _
else
: f$ a7 E" n1 r/ N3 V/ m; g, r
{
~3 o7 \7 h$ M& O& c/ n. G1 U) p- x
printf("No effective message!\n");
6 A( F, G3 y* R$ d. o6 V1 L: D0 f
}
* U, _$ r0 I; n) S
}
9 F; a: r# g4 b/ j7 c5 @
3 G6 T2 j: H8 Z6 h. _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- i. u8 ?" [2 m$ L% t
7 A7 H1 w, x7 m
! O$ r5 _9 a; d2 m- A6 H" K8 l7 x7 u
3 E0 r! b O3 y2 L: }
( U, P3 D6 u: f7 I) i
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4