嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) y3 a2 B9 X) B* `2 o9 t# n D
. z8 L# \* Q1 |. {5 Q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: Z- D) C _% \9 b v
#include <unistd.h>
5 m2 e7 s6 L; O7 K9 h+ d8 X" |
#include <sys/mman.h>
! h+ T2 U5 A* Q7 e0 s0 Z {" i) ~
#include <sys/types.h>
5 Z& N- Y3 F0 R/ ^% e
#include <fcntl.h>
1 w) B8 D- W5 |" {, [) X$ p
1 ]9 T9 r! A" o8 z# p
#define SHAER_RAM_BASE_ADDR (0x80000000)
4 O. r% Q L' d% `
+ ?% x/ t& e8 y1 J
typedef struct
7 z" s; X( @5 c! e! G
{
# e/ N ~6 i: Y1 g9 [8 b% |
unsigned int a;
: R9 r4 v( Z3 g0 c, D
unsigned int b;
! \1 ^' ]0 H. W. a/ n1 b
unsigned int packet_cout;
( Z; ^, Q1 E( b" A: }% {. T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; S2 `& Y4 w, R6 V/ t: ]' @" A3 Z
3 O( z9 M+ o# c R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ l$ r0 z) m) P) ^
unsigned int count_copy = 0;
0 j: w& _8 O5 v
* G7 w6 `) S1 L: C
+ }2 M& Z3 I# W; B: E2 j
int main()
6 E& K0 e% w/ q; q7 ?% S7 f" A
{
, s* \( w, }, C) b2 p( w8 L
pRX_MSG_PROTOCOL pshreRAM = NULL;
) S! Q) {) d+ F: Y
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
K! R2 g. `" @5 y$ D$ l
. L6 m) r9 p# T( N/ Y9 Y+ ]
while(1)
7 w) k9 j. I6 S" ` ?- U
{
$ Z2 T6 h. \5 b7 ~) Q% S
read_MSG_buffer(pshreRAM);
+ J0 b- d- K/ {- `, C
}
6 ^( p& a! a$ E7 E
}
6 N, M8 H/ D# ^9 h& z R" w
8 U$ o$ u4 F1 y' D$ }) [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" F$ G& M# S$ S- M' R* d, {
{
' e. e# A5 |' ] i y- `
RX_MSG_PROTOCOL buf;
( G! Z; b- F" R. k
9 W8 d- a3 N h$ e4 y
buf.a = pshreRAM->a;
8 x i/ {, \3 y
buf.b = pshreRAM->b;
2 j5 Y4 H; Q% E
buf.packet_cout = pshreRAM->packet_cout;
" w- T& q; ]" Q* u
8 S% V- j# M$ `; V. f& l6 ], o. C
if(buf.packet_cout != count_copy)
5 s( g) o& n. A2 s& u
{
, j3 W: y( D# I1 ^3 B" C3 i
printf("a is %d\n", buf.a);
4 v q# u+ P/ P. S
printf("b is %d\n", buf.b);
: O9 Z. G: `$ F* a, S. [
printf("count is %d\n", buf.packet_cout);
3 i3 a7 J) U& D. s7 r, W
count_copy = buf.packet_cout;
8 v# b+ c, W( d' }2 b+ m9 Y. I' o( H
}
2 s/ v6 A# M6 O7 V; u5 {
else
, B' y/ d& V( ~) h! K3 \: m+ \) G
{
! C" z" B3 y6 F0 o$ U1 B N
printf("No effective message!");
) z7 y5 q9 R4 M( z( n$ `
}
' V; M7 \$ T" }& |
}
( J8 `. _+ u0 u
, H) _7 i; L: M- R% u) l
5 c/ h) V# g$ z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: W+ t c% T' b2 q) g
使用下面代码,对内存使用了mmap函数后:
! C! r) Q' S3 q7 l8 F1 ]
#include <stdio.h>
3 P6 O4 I- G. {6 R4 c5 E. w+ c3 @/ |
#include <unistd.h>
* q5 _- W7 }3 a! P: G
#include <sys/mman.h>
# k$ b! D! q2 R9 h$ I3 y' {
#include <sys/types.h>
! i$ z) B2 S- R* t9 `, d4 s6 G
#include <fcntl.h>
) o u: x' q* e; M) `0 c. L
' R9 D5 j% W, K3 n# ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
) W+ W$ a' ^! o) S2 a- ]0 G
#define SHAER_RAM_SIZE (0x20000)
0 O4 ]9 Q: h- @! @+ ?
; B/ k. k; ?5 I) Z9 H" M" ]7 N$ J9 u
typedef struct
1 l; `; J" I; J% J3 S
{
2 ^. C" n( K; L& _
unsigned int a;
; _9 M% R& }2 P
unsigned int b;
! X- I: c% G- s' f2 ~/ U
unsigned int packet_cout;
; d+ E! _% S& o' i; W: x3 p P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ?- @8 i/ ~* ^! @0 G, W/ e. {
" W; v2 d9 R: Y9 `* W, _1 C
void read_MSG_buffer(int *baseaddr);
; V3 X: j9 b5 o9 q
unsigned int count_copy = 0;
) C8 G* n* ^: |; P- v. m( W' l
: P, y% p8 a" F) \- |! L
int main()
9 i( Q- g" Y7 i4 B% a; q% @: h: y
{
" c0 f. q; {" B: y. W. }
int fd;
3 g; V! V/ ]+ J& _
int *mem = NULL;
9 B- }6 {: A9 g
- @( B) f& A7 S: I; k
if((fd = open("/dev/mem", O_RDWR)) <0)
7 M8 g+ c& z$ E- u
{
$ J* o: ^6 J3 Q- \% Q! E0 Z6 E$ J& n
perror("open error");
. N+ v5 ^5 |" @2 N
return -1;
" ^- ~" D) m) g
}
8 _# P! z1 e9 s& f# \" \! b
5 G5 s @7 w6 m6 e3 j
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
# M0 W1 W j* Q) R2 E) E# ]
( z; W' t/ N( w
while(1)
, @* S% a0 x) c" h- _
{
, _; I; y2 l5 V2 b$ m- p
read_MSG_buffer(mem);
1 @8 }- p7 c. ]5 b( d5 D# }( T$ o, N4 l
}
+ p( v, ]) [0 d: ~' F, G
}
1 _: t. E- c; j8 U5 W$ L& f2 F
; D1 R* Y5 x/ E5 x# y4 v
void read_MSG_buffer(int *baseaddr)
& q1 v3 S8 D, G1 Q
{
% N$ Z, f+ ]$ K( \# U- c; l) C& A
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 W) Y3 u; U0 f7 P
+ }* S: Y) ?8 p L5 M! P: I
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 w+ z& i0 c" L% ?8 M3 O/ q. t
% {# O Q' }% i- @# a; {
if(pshreRAM->packet_cout != count_copy)
3 B8 t+ f+ n7 G* L" M
{
" w) n5 S! S3 S, v- h
printf("a is %d\n", pshreRAM->a);
- ~" G. L Y* ~6 i
printf("b is %d\n", pshreRAM->b);
+ y; ?4 ^* [+ r' H
printf("count is %d\n", pshreRAM->packet_cout);
& P, R+ C2 H% I. O8 [ e- C
count_copy = pshreRAM->packet_cout;
2 h y) E( c9 W0 g2 j9 c
}
$ E3 c' y. s: x% Z. n& T& v
else
2 k. `0 v( A) P( t
{
$ r" S6 ^0 U- R" j+ F3 G
printf("No effective message!\n");
; u4 d! x# i$ @8 j( }' n+ d
}
]+ C) M* q* j; z' g1 z
}
# ?. A6 p' J) P) a1 X/ l) P
+ {: Y# W$ F3 P5 y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; z/ v1 \8 |; \+ I; I. l) \) A
1 @2 w# N: F2 U: b+ Z; u
0 q/ s1 S S; b/ o. X
0 L" m: C" R- y3 c1 m( A- c
# J' H. t. `8 O8 I% X
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4