嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 c! e/ G" ~' p# \! r
3 ^: k- H, L$ H; B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: q$ P* R3 m$ c3 Z7 C- D5 t0 R1 g
#include <unistd.h>
3 N1 |$ \$ Q3 @
#include <sys/mman.h>
+ p: V+ @! k! z- ~3 {
#include <sys/types.h>
* h) }; @# _1 W/ J" o
#include <fcntl.h>
8 _2 E4 |4 c9 j8 C; q# o: P
/ v8 L; a0 h, @( n O7 ~: i
#define SHAER_RAM_BASE_ADDR (0x80000000)
3 \7 |, u2 P% X1 J! Q
1 f* A, \4 ~1 Z6 A7 P! Q& M
typedef struct
' D+ v0 ~5 l# J) f. z! X; `
{
% V/ p m, Y6 B- |
unsigned int a;
, Q& Q" ~$ N0 |
unsigned int b;
& A6 g h! a# K' e. l
unsigned int packet_cout;
( L( \3 _# w; ~- F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! F. w: w/ s: T k* o2 M. Z& p
5 w0 d9 z+ _8 g) u1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 E0 ]# E: Q9 S" [
unsigned int count_copy = 0;
* C: f% C, E y9 P/ O
5 ?. A. m# g' k# M$ h2 R
9 r: j6 t* O7 C# x9 k
int main()
3 j! ]+ G% x! i4 j# F# R
{
3 @# ~! k, H7 k$ Y
pRX_MSG_PROTOCOL pshreRAM = NULL;
" h1 p3 E9 @' B6 f$ n
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 I$ u6 q# C3 n: V* {6 e: p1 E
; N+ V7 j0 j# ?. O/ C0 k9 H
while(1)
, n6 ~; E# O% @
{
0 q7 B) w9 @* L
read_MSG_buffer(pshreRAM);
T) a9 w; M! ?. Z. y
}
; P/ y3 w5 Y3 _# ^, @" C0 W
}
- r- f1 ?4 |+ D3 ]4 z$ t
& @+ v! ^, q1 c* Q4 a! f' Y4 @/ ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& U* \ n# b+ U5 e( M0 p3 {
{
( R+ ?0 Y( a0 \: V$ w- _6 p
RX_MSG_PROTOCOL buf;
& D% p, r ?. S
9 {0 Z$ E/ W2 r- @1 b; G! T
buf.a = pshreRAM->a;
8 e# Z9 U7 ?6 a8 ^- ]$ ?
buf.b = pshreRAM->b;
. k" v! v J% ^, `4 O* i! O; b! V# M2 V
buf.packet_cout = pshreRAM->packet_cout;
" }. K7 h) K6 }% f
' w5 u/ I6 \* J7 z. i0 r; p
if(buf.packet_cout != count_copy)
7 P8 a( l* X) p c6 O8 o
{
! x. _1 e$ V3 T* E8 ], ^2 ?
printf("a is %d\n", buf.a);
& g4 r9 k% P' @ w* f3 y
printf("b is %d\n", buf.b);
- }" x% D% j4 E9 h, `* P, r
printf("count is %d\n", buf.packet_cout);
l! m3 W; `6 r- U5 e' ^
count_copy = buf.packet_cout;
- f* ~0 D6 L; s. O" W+ J
}
+ [! q# `/ `4 V7 `% M2 `5 `
else
2 g# D' o. f% V- y' Z( I0 V
{
4 @; [) [! d1 u' r' z
printf("No effective message!");
) @2 Q7 C3 U6 |; Y
}
5 r/ Z" Q4 ^ {7 |* G! g7 a3 X
}
5 {: O$ }) ?2 s, w1 | }' Z" b
# U9 Y) w9 g) s: t1 N. @$ M
) r8 t$ Q1 W7 {/ u
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' Q1 T0 B+ @) \( w$ X" x
使用下面代码,对内存使用了mmap函数后:
) N7 ^1 z$ s) L# q
#include <stdio.h>
+ R* s2 A1 m u5 G
#include <unistd.h>
( L6 \8 a& ^5 _1 y% p Q5 K) \
#include <sys/mman.h>
- l, }9 O9 }+ Q, n3 e) v E- H
#include <sys/types.h>
2 S* _+ }8 w$ E8 X) S
#include <fcntl.h>
2 D6 ~' O2 ~3 w' w
, D v X- G2 r+ k# h0 T
#define SHAER_RAM_BASE_ADDR (0x80000000)
+ n+ b" m. c5 \$ Q) ]5 |
#define SHAER_RAM_SIZE (0x20000)
2 i2 @6 j" J! }1 ~; [" k2 D q
/ A# m7 |. t7 u" u+ m
typedef struct
" O& E* D6 ^* P/ N" M1 ^6 B
{
3 U [: M& j7 b9 r
unsigned int a;
; b( `/ L b2 T( T# z7 k8 i: ]7 I
unsigned int b;
& S" `3 C+ n; \ e7 K
unsigned int packet_cout;
) H% r+ ?' S& K0 j
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" R8 Y3 ~1 P; p7 [5 v
4 |2 o% U- i% I. [' ?8 P* g
void read_MSG_buffer(int *baseaddr);
6 v" v; X: E5 `1 M- T9 z
unsigned int count_copy = 0;
0 p' P9 [2 Q& {0 u6 b U
; N5 g0 E" W1 }8 T
int main()
p. T1 _. p9 c% E1 a
{
7 j2 V) o* q+ s9 k
int fd;
+ ]1 [ ^9 g$ `+ X: o
int *mem = NULL;
3 X0 ]$ `+ x2 ]* o2 i o
# [* u* G8 {/ h7 M6 b2 J8 u; s
if((fd = open("/dev/mem", O_RDWR)) <0)
5 Y7 s# Q/ h, }3 |9 I @9 k! ^' P" R
{
7 @' w& D) b# c! ^- c8 W! [
perror("open error");
5 Q# ]6 N: y4 _, M' a: o0 Y3 _+ T
return -1;
; o; d7 x8 s( m* p# i3 y
}
9 ] @% H& X0 Y& J8 E
) Q4 L& a# I& r7 ?
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) [! q4 o# \6 _4 h; W' Z# c
# D% }6 l0 k. @6 s9 h6 J" s
while(1)
8 h7 P( [- d5 [9 c: ]' k! W O
{
& a; w8 S7 |! `' x! Y
read_MSG_buffer(mem);
* ~; k. M% t& T9 R
}
& K$ L9 U# W4 t; O
}
* Z$ N3 T' _ p1 q! M
: F1 W+ O1 m) o
void read_MSG_buffer(int *baseaddr)
* L6 e: m {( g& z) }4 g
{
: k* ]" @" ^6 s) h4 [
pRX_MSG_PROTOCOL pshreRAM = NULL;
. p# V" F8 U( {* a
& G5 x4 M/ w9 f7 i8 ]( Q
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ }9 q: H1 g/ q" r6 I
, N" g) H) n6 v8 t/ M
if(pshreRAM->packet_cout != count_copy)
L+ B1 @# X: \7 c9 ~
{
8 ^9 j/ h/ f6 ?
printf("a is %d\n", pshreRAM->a);
0 u% a2 G- b* |/ Y I
printf("b is %d\n", pshreRAM->b);
1 L# U' y: U) H B6 t
printf("count is %d\n", pshreRAM->packet_cout);
8 u7 R* _0 e2 X" Z+ N
count_copy = pshreRAM->packet_cout;
! D& g* R; b3 S5 R+ k& U
}
$ G5 Q: [( x: K( k+ U$ R
else
. w- r# j! i7 Z# V& C7 M
{
* `9 O. z" U9 O7 C1 k: x# z
printf("No effective message!\n");
' K' z; c2 M; e2 ^
}
2 Z# ?% p% @6 O- k+ H& o! u
}
- S% G3 Y1 [" X" G
! D! v/ K5 [% K) ~6 Z! B. |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 r& E* i, R/ a! n6 }" u
8 a. A, w3 { p* B6 X6 @
$ @$ x# X9 n) [! ]8 ^
5 T0 b' `4 _: C! @) F
. P# m8 x" Z, P' `- R# Q% f. L- D
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4