嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; Z1 ]4 ?- y/ I* N0 ~* G4 F
6 i1 }2 R+ o, g* q8 J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* q0 \0 b# I" T$ H6 h J
#include <unistd.h>
+ V# o8 T3 Z$ F+ h3 Q
#include <sys/mman.h>
7 W. `6 u; x/ l% U
#include <sys/types.h>
: y$ ^- c7 F- v3 j2 ?" P& p, h
#include <fcntl.h>
9 a. _2 ^2 O1 V, h- X) j
5 ^! ?* [ O p
#define SHAER_RAM_BASE_ADDR (0x80000000)
0 X- E ~/ C& A3 E
. b4 S' |" H6 n$ z; g8 X
typedef struct
* |& Y) P1 |* _ U, w7 P
{
, Y$ [ C) A5 B. j3 O# L
unsigned int a;
' f) p+ O9 h M L" r
unsigned int b;
4 ~& b1 W J' a+ j1 r8 j$ W, S( |7 ?
unsigned int packet_cout;
7 D$ h* J) M/ s% m# |6 m$ P- V; s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
c% K: C/ J# S
/ k) s, k' \7 I1 G# c5 X' U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
- [% ?4 X' i5 O8 A
unsigned int count_copy = 0;
v5 j. }% t: p
4 `7 r9 Y3 H% M% \
3 j, w$ X, k1 J% v0 a- K
int main()
1 t0 z$ c, b% N, T4 e. ~& J; {
{
% ]! w: @2 C- K4 \4 o h/ O
pRX_MSG_PROTOCOL pshreRAM = NULL;
8 Z/ \, O( O" x& Q j
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 J- b" E; e. f6 k6 l8 [
( Y4 @, m9 ~) w' P- A7 y
while(1)
X5 ~: f$ X" T8 \) w
{
5 ]1 U/ i8 e# X* r+ D+ \& V6 Y
read_MSG_buffer(pshreRAM);
" ?% V7 g, m$ S0 m y, G! p3 o
}
4 H9 o% p, Z1 `6 _1 |- \
}
+ u0 z' j" c+ J, g% ]
0 {8 o8 u$ f, s n9 H5 K# Q; j$ Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 I! }& P( z9 a- }
{
# B: Q: o# Y, [# w
RX_MSG_PROTOCOL buf;
& L" [3 `* F M# v' K
3 Q% M0 o' T; O8 K! N
buf.a = pshreRAM->a;
J) N( O# H0 C6 W
buf.b = pshreRAM->b;
6 ~! x" C8 o8 a+ |1 J
buf.packet_cout = pshreRAM->packet_cout;
& f( K/ j [" S3 M. U v
) ~0 T+ g8 a0 C; j, d, p
if(buf.packet_cout != count_copy)
& u, _" u! w5 l& f
{
. _4 w# c& G" ]$ e; `+ c
printf("a is %d\n", buf.a);
9 A# D2 v' F2 s: C& C
printf("b is %d\n", buf.b);
' w" [& q& R' ?6 e% F
printf("count is %d\n", buf.packet_cout);
5 \. s6 i4 ]' [
count_copy = buf.packet_cout;
9 {* X. z& _+ Y
}
$ h" E' b. g1 g# H4 j1 u3 k
else
( D) G/ |! C% F. C5 \$ x
{
# J. l& ~ B' R/ n w' u( H
printf("No effective message!");
8 `8 _0 i/ c, Q8 D8 H# Q5 j9 m
}
* ?; Y( }( ^! n
}
- H* }0 b0 U& F5 v" R" z
3 @5 O5 t `& K% ?
' r I" y F) G7 c! m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 V* r( x; u! {6 F
使用下面代码,对内存使用了mmap函数后:
" M6 n! @: \& I4 V/ T# E
#include <stdio.h>
7 X: ~8 E1 X5 t
#include <unistd.h>
2 x3 ~9 |) [+ p) x. S2 b# [
#include <sys/mman.h>
6 r' d2 B) C! }$ t
#include <sys/types.h>
: V2 t" n3 k1 G3 O w
#include <fcntl.h>
+ x. k# w& |6 m, g
; g% P+ w/ g& _# E @0 A& E5 l
#define SHAER_RAM_BASE_ADDR (0x80000000)
' p# w" c' T7 D# m
#define SHAER_RAM_SIZE (0x20000)
6 g+ w& O \$ W& [# a
5 x) l) v7 n9 v/ E* i( L' E( ?
typedef struct
9 A Y1 y3 n1 V% |
{
# U1 I1 j1 r' X9 `5 Q
unsigned int a;
2 J4 |/ V; z) E! \- k/ I3 @
unsigned int b;
# r& e- v9 N# _3 H
unsigned int packet_cout;
9 k* r( [8 O/ O( E' q0 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 h' a" s0 o8 s0 m, P0 F$ t" a8 Z
; h7 {, J& H/ V9 c
void read_MSG_buffer(int *baseaddr);
7 p5 `6 N/ l# l, t' W0 h( l
unsigned int count_copy = 0;
8 K2 H3 ^! [- h! ~1 Z$ b3 t
* k+ m. h8 q" [; M; O
int main()
2 R5 b' V; S }8 L
{
. z8 X2 b5 a# y5 T" {
int fd;
- q) W5 {6 h# J' ^# O; Q
int *mem = NULL;
7 {& I8 d4 X* t" L! j
8 H3 P1 y5 _# z1 a8 G, X
if((fd = open("/dev/mem", O_RDWR)) <0)
( M. ~' K8 P7 v6 ?
{
! z% F+ ~ ^5 l% K* D" o& G6 e
perror("open error");
1 G ?. \. U: w7 ?: z
return -1;
6 M ~& {$ w! K) N; o5 Y
}
+ ]& y$ O, L; ^7 I: l- @$ m
$ {: @4 \% z9 L# S
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ G5 T2 P9 _# s0 Y
. ~: c G, E- Z* G; x. Z5 f
while(1)
' e }0 Q1 ^- Y1 L2 @
{
' ?2 H1 c$ e# t" s0 m+ n% c' u- z
read_MSG_buffer(mem);
6 x+ U, b( d9 G$ _
}
Q$ g, a, c6 H# G+ R+ i8 n$ A
}
: p5 _5 z: _! L' j# T h
I: y9 Q" e* Z) n8 x `6 W# m
void read_MSG_buffer(int *baseaddr)
1 Z. |# M5 y& m5 E
{
# t5 }8 O+ ^' F3 m* r9 w
pRX_MSG_PROTOCOL pshreRAM = NULL;
' W( `% T' |) O; X( T
% ?; v5 ?+ ?: u \5 h, U* L# z3 l
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: {- J9 \( G$ V* M' K$ l, A1 D
1 G* P+ h; s F' B! l# u& B
if(pshreRAM->packet_cout != count_copy)
9 A6 U8 p& S( S2 P: [. u& Z# Y9 k& H
{
% @3 X9 _2 }; X5 V# X" v
printf("a is %d\n", pshreRAM->a);
5 f2 s) j' x4 Q' f3 B
printf("b is %d\n", pshreRAM->b);
. ~8 T% o% {7 B" U; m0 K# Y; U
printf("count is %d\n", pshreRAM->packet_cout);
1 H$ u) F% n3 f' u9 K, ?
count_copy = pshreRAM->packet_cout;
- K- Q* v. l5 k c' @' j( P# D
}
) `% a. I- z( p: V+ M* [
else
. r% P" ^7 s9 s. q! x
{
& t7 K5 Z. ]: p0 U7 O
printf("No effective message!\n");
- b- l+ O. v# _/ o
}
* R( N% s+ H, ]! y8 {3 {0 y
}
8 J1 ^9 C8 c& M9 { J @$ f, w$ {
o. x$ r7 }5 R- |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 R, l D2 q! P8 m0 B5 @( A
* [" N2 E4 X4 u1 z3 N* M
' K6 G! @+ d1 I
6 ^4 a$ b9 R/ Z. ]7 k% F
2 |4 j6 P& |2 h
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4