嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- x/ u- ~: w7 E1 F5 C1 W; E3 @
/ z& \! L9 H% ~* |' r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& v8 j! `+ O6 X0 l
#include <unistd.h>
. Z9 a! ^/ j: n# t& h' w
#include <sys/mman.h>
" r+ c9 u& q) b- H/ _+ P
#include <sys/types.h>
" E' G9 X+ m$ d7 t' I$ q
#include <fcntl.h>
, f4 \9 O# C! m7 K* @6 c
% l3 u. d2 O0 g' @% _% U1 N
#define SHAER_RAM_BASE_ADDR (0x80000000)
- A8 p5 I- F t- o' f5 H: j* [
: z. ^& [$ J9 U5 w* L; n7 z
typedef struct
- a$ f6 H+ u H9 @2 n4 @& [
{
5 t" T0 i0 h" P; i1 h) F4 B5 L, Q
unsigned int a;
0 k/ g; z8 u' r, F# D; N
unsigned int b;
7 E& G. w& |. y. A1 ^* U0 U# V
unsigned int packet_cout;
: J9 e; t& E$ T0 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# V) q: \0 g0 x0 T
8 f8 } j8 f$ `) h, i# \( z0 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 _1 {& Y0 H5 H8 Y& n9 V1 D
unsigned int count_copy = 0;
' n! W' q% F7 B$ N4 F
$ B: H$ ^# _1 J; ? W0 T
0 G c# o! V, [9 A' w; ^ L
int main()
7 [% W* O f U& i" X
{
1 |, h& L) e: Z
pRX_MSG_PROTOCOL pshreRAM = NULL;
; i5 E% P9 A/ i
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) F0 W4 n; ]9 ?/ s6 p" l
; ?* W+ n. d c, h+ E
while(1)
7 i! U3 @6 i; v7 `. `
{
6 r% L2 _# T1 F$ K) n3 U, Z
read_MSG_buffer(pshreRAM);
8 h+ U2 d4 a; k, z! h) a8 ? Y7 [
}
1 m" B0 R. Z* G8 F) C7 m
}
7 X) o5 C* m% g
9 S2 \) t1 P; K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- @6 r! Z3 f) N0 a/ H7 M
{
' s, F- r6 G; _& h9 k
RX_MSG_PROTOCOL buf;
8 N( {' M# z- J: a$ K1 x
% q' X& C6 P: s7 h
buf.a = pshreRAM->a;
/ g- i; R8 L, b, `
buf.b = pshreRAM->b;
2 Q5 P7 a+ K; o$ e, N# J
buf.packet_cout = pshreRAM->packet_cout;
/ e! t! b" u* D8 @& U
_) s$ E, [3 c b8 ]
if(buf.packet_cout != count_copy)
$ t5 V) |1 N2 ?# f" D) k
{
4 z. W/ p- C" x1 Z
printf("a is %d\n", buf.a);
% a. d+ K- U0 j6 t5 v, E0 a0 ~* E/ y, V
printf("b is %d\n", buf.b);
?6 l7 B. ^" I, P1 `/ y( M
printf("count is %d\n", buf.packet_cout);
" g# G+ P# p: P* O& h6 Q$ @
count_copy = buf.packet_cout;
3 i( D! g, R9 g
}
. J& X P/ x# M; r
else
# ?: s' {, M& `+ Z( g1 J
{
0 o! F3 K* ` Q+ O
printf("No effective message!");
+ H3 }3 R* o- r
}
6 {2 V. ?& z+ ?
}
7 _) P! d( c: x& m! t
5 Y1 t2 k u/ h1 c; h
- h- d7 _5 d& Q8 r" `1 |. i; t! X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* i2 m. ]# c! y% x m' W
使用下面代码,对内存使用了mmap函数后:
3 t4 i/ g9 o4 v K
#include <stdio.h>
% w$ z# |$ Z' H G
#include <unistd.h>
8 A! s. ]6 b0 ~1 w4 N8 I
#include <sys/mman.h>
0 l! l6 r$ O N7 [' @
#include <sys/types.h>
3 U! D& j1 K: U, d) q4 O
#include <fcntl.h>
$ D' ~0 F) t2 @# _. o
+ i/ ^4 g7 Q7 D, M" q3 o- w
#define SHAER_RAM_BASE_ADDR (0x80000000)
/ {* L! _8 v" [8 \* ^2 D
#define SHAER_RAM_SIZE (0x20000)
, V3 `; f# {' Q) o
" P3 z9 s' T, o# {! n o3 M' r
typedef struct
' F+ I, X" P) g2 c$ Y
{
8 k" h3 f" t# g1 h4 j! F+ S2 |
unsigned int a;
! z' s" U' |0 \4 ]
unsigned int b;
" {- c0 k: O. p% V T
unsigned int packet_cout;
2 ^ g0 I; u3 P0 L! P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- k5 Q4 [# x. V! P s. W
; e% A+ }1 F. q
void read_MSG_buffer(int *baseaddr);
$ v% E- m' W9 V" ?
unsigned int count_copy = 0;
' \, O+ j* E( ]# |6 e" o+ M
* z! e* X, D) }- T4 M
int main()
- G0 O% X8 s/ ~9 V4 _
{
2 ]# M% y1 h: o5 N% t C O# d
int fd;
1 Z2 f, E5 }! G) W# b
int *mem = NULL;
2 v( \* W( P2 n% t2 T4 V
0 L1 v" B, U$ V* F
if((fd = open("/dev/mem", O_RDWR)) <0)
' R4 E/ g5 k% f9 @+ R
{
2 Q& u: o& I X
perror("open error");
1 I9 F0 g) `/ I% M: u. t8 J! P
return -1;
J9 ?9 Q* U$ L2 n5 ^4 ?2 ~
}
( G. g# w' y* |. H1 d- s L
~, C: l" K0 m! F5 [
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ Q# r. v U4 ~3 `
3 ]! o" \, O6 o7 _) | a- _
while(1)
; Y1 e- e0 \4 ^: l+ z8 |
{
$ [2 A* F& Z0 O
read_MSG_buffer(mem);
; b7 [/ ~6 u2 j% u) P
}
( X+ k( g4 F# `- P0 a
}
3 I/ }6 L( f7 U" p5 m0 p/ v2 R
" J) [# _: Q; X9 X4 X
void read_MSG_buffer(int *baseaddr)
& O& u+ ^3 M) s j( z( w# g
{
: Q. z- W. [3 U. G" K
pRX_MSG_PROTOCOL pshreRAM = NULL;
3 a8 ^7 h! @% L" k
+ R0 D9 h* @/ U
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 H- K9 ]* h, L' D/ b; [( ^9 ^
5 t, [' D; [8 \
if(pshreRAM->packet_cout != count_copy)
' b0 K! w& M* S& o' P5 g4 s* X" G
{
2 C* Y, S$ |- S
printf("a is %d\n", pshreRAM->a);
5 V+ `$ N6 Z& X" Y" `
printf("b is %d\n", pshreRAM->b);
) }3 J3 k+ Q9 S) K5 s$ {
printf("count is %d\n", pshreRAM->packet_cout);
, g* D( S8 d7 {2 \* ?/ r8 b6 \. r
count_copy = pshreRAM->packet_cout;
9 b5 a! t) p# R6 S8 w9 u4 G
}
! ], f Z; G" [0 Z
else
' A9 c) a& F8 E; D9 C
{
6 I5 ] B/ N/ H& S. s! {( `1 v0 ?
printf("No effective message!\n");
2 C4 ?, u9 D. V1 S
}
E' x. Z: @6 [3 F" C8 S
}
2 U) D; Y* z- M. O t4 c
4 j) y# I. r0 \! {( S' W% {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( w' i1 |+ c: U8 }8 A
# p. I" q. e7 o7 H4 {7 d+ _& X
( B% `7 [1 ^8 N: l. G
2 {5 B& z6 Y" s! a
$ G7 O9 {8 \6 ~
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4