嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ ]( E+ f: E, \
1 u$ \; Y6 H, n3 H9 p! e6 C
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: F" H: |! j3 k6 b
#include <unistd.h>
4 u9 @: y6 i3 | U, Z8 _4 x# Q6 ?
#include <sys/mman.h>
& `+ R6 o9 ^0 H4 o* l
#include <sys/types.h>
% S B' C' ?5 l- k- @. m
#include <fcntl.h>
1 G8 T8 @) y/ y( _: `" U# w
" \* @) X' B8 ?6 z9 N( x3 H. z7 w
#define SHAER_RAM_BASE_ADDR (0x80000000)
% L) I; \- q. D, S1 e: ~
9 i# @) ?- ~" @4 e3 n
typedef struct
. |5 j# P, ]* \$ {, ]1 ^
{
, m9 k0 x9 x7 [" e3 ^3 B: V
unsigned int a;
; ? E0 b) x' N% }8 M% d2 x
unsigned int b;
8 x# p$ [4 K& b4 v
unsigned int packet_cout;
U. t8 E. P% p, n a* i/ X9 b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 B+ G+ w y4 s
* v1 [- w' S* R' n' h& p* W) v1 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" P3 h' K, e; Z; V" g
unsigned int count_copy = 0;
. I9 A f% j: t; I- }
9 j4 R( U+ N- @6 z( z
$ g3 K2 T) o0 _
int main()
9 B( [: \% y' I P# {% H
{
% D3 q. d9 S, ]/ c
pRX_MSG_PROTOCOL pshreRAM = NULL;
5 N; {/ W; s8 ~
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 S% e3 q" F/ A2 F# ~1 M+ E- F) ^9 n
5 S; f8 f" j( v6 U
while(1)
, R9 a% |6 U! D: D0 L. B% v
{
% u5 [" t& m) X& l7 [7 R% `8 R- E. P
read_MSG_buffer(pshreRAM);
2 h; b+ F. E4 W9 `2 j
}
/ b* i9 I) d7 ~
}
8 d% a. n' L3 n- G
Y5 x! Z2 h/ B9 o' B" i" h+ Z* g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 D" m* T& F7 E
{
1 U5 G2 G) K4 I. G
RX_MSG_PROTOCOL buf;
* a6 G+ @# m- X# q4 ^
; j& C E/ R1 R3 ]- {$ [
buf.a = pshreRAM->a;
2 j# A7 l9 Q. B; z2 c
buf.b = pshreRAM->b;
/ i6 h5 B! [( N8 Z
buf.packet_cout = pshreRAM->packet_cout;
" M, G9 h" c2 {# E, O5 s
& C$ C; T' D# f# `
if(buf.packet_cout != count_copy)
* [, |( L1 W" E
{
" F; [5 R" ~; o' ~+ G
printf("a is %d\n", buf.a);
. A+ o5 w1 l8 ?# E
printf("b is %d\n", buf.b);
* k b. `# H% w3 l ~# l
printf("count is %d\n", buf.packet_cout);
_0 P% U2 f! X
count_copy = buf.packet_cout;
$ G3 U7 ?5 u& ] c: D7 d, v
}
' w; @9 U" i3 J) ?" l
else
% _& ~6 z5 t( ]
{
% |) h& c* ]- z5 z/ N7 U( M' n
printf("No effective message!");
4 e2 o- g D( C3 w1 z$ _
}
; ]: `% h9 r) i% F
}
0 t, ]) h& ] a
$ g1 k! y' X: O: }4 q# K0 n
, i) I0 p, D/ E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( g" m: e! F8 I; _/ I- R
使用下面代码,对内存使用了mmap函数后:
& Y; Q3 T+ @% x
#include <stdio.h>
1 V$ {$ T* M3 R! |6 T' g. B8 k6 z4 v
#include <unistd.h>
( W; L9 h( l* T$ n2 C1 _( ~
#include <sys/mman.h>
! B/ X: f( O6 {& N
#include <sys/types.h>
/ J" h3 x/ k% b; V0 |& z5 `
#include <fcntl.h>
8 ~; J# L- \- _* v; N
4 y9 f! f8 x5 ]( m; B! D9 ]
#define SHAER_RAM_BASE_ADDR (0x80000000)
( ?/ f( r: I0 W# Z2 [% U" G) X
#define SHAER_RAM_SIZE (0x20000)
8 j9 Z' K% G% x$ D" ?: r% r8 j$ x4 H
8 O+ M8 W A; `8 U- S- C/ q% T
typedef struct
$ u, o: a6 D8 u% \
{
3 `7 o' g; f( m- s _0 i. M1 w- C
unsigned int a;
& W) @' B, k3 c& U9 R2 V% O
unsigned int b;
! r6 Q, }% U, f
unsigned int packet_cout;
' Z; q' ]- h* t9 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 c+ j9 k8 g4 U" F6 u
$ N1 Q7 J( l- B0 j8 f/ b, z
void read_MSG_buffer(int *baseaddr);
( x( y0 O6 r; s9 n1 C
unsigned int count_copy = 0;
/ o' w4 N1 Y v% x% f2 z" w' t8 T6 g
- e# K: |. }; a7 |
int main()
; v* S- G3 Y1 k5 a
{
* Y/ t3 l( D% U( v
int fd;
. c) D2 f9 B: e
int *mem = NULL;
5 |& t+ B! C. ^$ t9 N6 F Q; l
1 P! d7 e: [) m1 d' o# j( C
if((fd = open("/dev/mem", O_RDWR)) <0)
7 [" |) @0 G9 r1 I& V, w* E
{
8 s" n4 y2 j+ r }
perror("open error");
( K. O& V4 p% Q4 S j K7 D) U1 B6 {
return -1;
6 d& S) N1 n9 P0 t6 Z
}
$ [$ J) H3 D2 x
' @: g9 w; ~& p, Y
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 g) L: F& C2 o0 `
7 n! l5 l# `, o
while(1)
! m5 U, y3 |% H- o( {9 X
{
. A {5 { f( P$ ~$ a$ v0 U
read_MSG_buffer(mem);
b% x6 Y3 ?' y$ b) G
}
6 Q# O8 n j4 `7 u: ]
}
5 K5 \# Y" Y- @( t$ |1 h
$ |$ g9 q. D! i) R9 b h
void read_MSG_buffer(int *baseaddr)
/ p9 B; Y* ~& W& n3 g
{
( g$ ^& l, a& T' } B# `5 W
pRX_MSG_PROTOCOL pshreRAM = NULL;
w+ T3 J3 L. q' ]1 @; U
" d" A8 l8 Y3 B' Z
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 S' t( j3 c/ ]
" v% D" w6 D9 w j
if(pshreRAM->packet_cout != count_copy)
9 A$ c2 E) e- h Z# `
{
8 l; K0 f3 j6 ^* J% S* }
printf("a is %d\n", pshreRAM->a);
. Q2 e) Z: q0 y4 Z
printf("b is %d\n", pshreRAM->b);
; b+ n% N5 K6 d5 o) [
printf("count is %d\n", pshreRAM->packet_cout);
8 s1 z: _ p6 u; R6 d% T( Z
count_copy = pshreRAM->packet_cout;
! o7 N( L U- [3 m; w) h6 |
}
; b- @6 ?( B( Z8 B5 ~
else
7 Y* f+ u7 T n8 ^6 S/ S. B) p
{
4 M. G: h, z( L* ]4 O" x" |7 R* K
printf("No effective message!\n");
, `. w" Z% ]) ~
}
; T% y( B1 f; i P2 P
}
* u( m' N! [5 Q3 d1 @
. H+ O8 @2 f/ e3 G* g
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. q3 R, C$ @1 \
; x/ z* `! d- j( r" f6 O; N4 B
! }: r: ~+ c2 { ~" I
2 V6 B7 g) p# g, E* z2 e
6 a0 J/ x5 d! N, t" }& `
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4