嵌入式开发者社区
标题:
OMAPL138的内存映射是否在Linux下已经完成???
[打印本页]
作者:
zc_fly
时间:
2014-8-19 16:38
标题:
OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) h/ S E4 E% z$ R
, O8 E# d- \" p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
_0 H, {# ^9 Q
#include <unistd.h>
0 r8 H3 d9 W' N. i) ^5 U' L
#include <sys/mman.h>
( p1 Z' v# P, |! i
#include <sys/types.h>
0 K) B, z. d2 |
#include <fcntl.h>
- R: b1 |* t; g$ I. N% a
1 a2 ~: @# r: K
#define SHAER_RAM_BASE_ADDR (0x80000000)
5 `2 O! x5 Q( J- r! p
% I) Q. i3 } ` ?5 j& l. z
typedef struct
4 |# s* u+ x1 ^ A
{
1 |- z! I# O8 e# N
unsigned int a;
?3 Z6 `# ?; ~3 Z
unsigned int b;
1 A! L; z) Z9 l+ Y" D. ~
unsigned int packet_cout;
! j3 I9 R* U& _& e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ K/ I" D i, C; k0 k
8 C3 v8 E# m4 s3 n0 L* t; L- \: E7 i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: h; h/ A9 y Z% v6 |4 T1 h2 U. F1 N
unsigned int count_copy = 0;
9 I1 R% u/ u: ~8 I J; A( o
+ A X& ^" w6 e. U( _
8 |, L( K1 t, p. Q4 L( y
int main()
; J) v1 e! X2 o; L5 o. \
{
( J$ f& d9 J- p' v6 ?* s
pRX_MSG_PROTOCOL pshreRAM = NULL;
9 ~6 }# y+ u! [) f3 j5 D' E
pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; n" `4 H4 B% Z* ]
: B2 }# {" b5 h! {* v2 [! ]# t" N& G
while(1)
8 c2 N* j- b9 ^/ q9 L
{
7 d" Z& d. N6 Y. U2 L8 X+ F5 c8 {
read_MSG_buffer(pshreRAM);
5 R7 f2 a8 Q8 `+ B- R2 Q( C' y' ]' y
}
1 ^7 J! H9 c- V8 S$ n' U
}
( {; r8 E2 M3 ?( Q
6 e' f1 z+ `; i T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- M0 \/ g8 W- |: Z4 I
{
9 ~* S# m! s$ S
RX_MSG_PROTOCOL buf;
, T! ^3 n4 t0 O
8 S `: W5 p. U* a
buf.a = pshreRAM->a;
% M7 j5 p3 p3 F5 T6 _: A
buf.b = pshreRAM->b;
. E' m2 e; f( o) t5 Z. N( \
buf.packet_cout = pshreRAM->packet_cout;
! h8 l$ w% Q8 n" {$ T
. \0 r* l" A# f' d; L
if(buf.packet_cout != count_copy)
5 u/ j0 G0 F' O
{
3 v7 ?# P8 L1 _" T. X2 r' x
printf("a is %d\n", buf.a);
' K( {+ ]4 z7 d ]" @1 B$ I
printf("b is %d\n", buf.b);
/ w5 p8 ]" U% ]" c' L) C
printf("count is %d\n", buf.packet_cout);
: ~1 @4 Q0 ^3 M7 H7 ]% w; B1 [
count_copy = buf.packet_cout;
2 S$ H7 X- o3 A* Q- k8 V/ t( D+ n
}
! L: v" \, _4 j1 |) `$ \
else
6 A) \# f: ~1 B1 @( C5 Z# u
{
: E2 S- e+ c% q8 H+ s
printf("No effective message!");
0 f- y a! z6 G7 H
}
* M" C+ ~& h% t. I. U/ a
}
! ~* e! P3 @1 o4 f# J% M" n2 |: T5 s
& [1 L4 V+ [5 f1 H
* r/ g, i4 a. \8 b; K6 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" k5 ~' X6 f/ Z' x' X
使用下面代码,对内存使用了mmap函数后:
% U t& w4 P- m' D( f
#include <stdio.h>
) C w# Q% P/ D+ P
#include <unistd.h>
4 K3 r9 P5 C- [' ~+ C: R; S- k1 r
#include <sys/mman.h>
+ p* D- d% R: O$ X$ U# ^
#include <sys/types.h>
, C$ }* _8 y1 o4 M4 q5 X( j( X
#include <fcntl.h>
9 {, }& k2 Y- [/ ^& ^; m. ?' Q
% z( b3 I8 W! m/ f& N/ q2 u
#define SHAER_RAM_BASE_ADDR (0x80000000)
8 X; E( V+ O: b% T+ _9 m6 e4 ^
#define SHAER_RAM_SIZE (0x20000)
' [/ K% m) s' U8 G& D
! E' g# M7 y5 I% I7 k
typedef struct
& ~# A: H# e0 g$ r! `" p' P
{
/ _0 h' N2 R/ w/ R9 u0 d0 m8 a S
unsigned int a;
, e/ {; Z' M3 g, r6 U' l! |3 s
unsigned int b;
- C! V/ ?2 T& o5 ]% S' ?2 Q
unsigned int packet_cout;
7 _9 L, C$ t! S4 L- E9 w" y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ E6 U* t- ^' `
3 S" Z6 t+ ~. L" O
void read_MSG_buffer(int *baseaddr);
& d4 n2 S+ n- }
unsigned int count_copy = 0;
! Y; z! ^6 ~( n- ~# @; P: I
6 H3 e$ @0 @" _# P0 y, b
int main()
0 [$ r7 n( g! c/ f
{
& c+ g8 F. ?/ ~6 L
int fd;
6 z( D& i" O) K
int *mem = NULL;
/ b: T+ m) U, x6 n4 W r$ i. C
3 O9 ?/ |( ^6 P
if((fd = open("/dev/mem", O_RDWR)) <0)
) A# @3 V8 U8 s; p- C! n- O7 J* j
{
0 m6 g/ `! n1 Y0 |
perror("open error");
( ?+ y% b0 t/ [% t% s7 p
return -1;
' `3 D" r+ n& F/ h9 q( _# v
}
6 f% q; l' F; B J
( g" U7 J& a! n; D: |) Z" q4 C
mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; Q8 r! F* B! U' p
+ c6 R: S4 j1 f! v# {
while(1)
3 K8 ]$ K, S+ r& { W
{
" v Q6 m2 b) _8 R
read_MSG_buffer(mem);
" {# Y q% n- `" E* a+ C; i
}
, B* b! r) v0 o: m
}
2 Z2 T: o- ~5 V+ O& s
1 E8 ^8 w& Q3 v) o" F" v, ~4 C3 G& ^
void read_MSG_buffer(int *baseaddr)
' k( \+ ^+ z- J+ V2 W3 X& ?% R
{
" W' m% T; ~' z* I
pRX_MSG_PROTOCOL pshreRAM = NULL;
1 g+ k' Q/ Q: m
% }; Y$ \+ z7 O% C
pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
- R3 ~6 L" N) P9 B. W+ W6 z( T
+ b* W. \* H: c I
if(pshreRAM->packet_cout != count_copy)
" `# Y O" u3 t1 u
{
/ A3 i6 S; M( b2 t/ \$ Q8 B W6 ^
printf("a is %d\n", pshreRAM->a);
" v5 A4 E0 D6 y! ?) V8 U+ {
printf("b is %d\n", pshreRAM->b);
$ k. e" {% z$ U
printf("count is %d\n", pshreRAM->packet_cout);
7 t6 e' P7 j, D; E
count_copy = pshreRAM->packet_cout;
" ]- C. R6 e+ V( l6 m+ T
}
( F6 J- _. |) v9 L7 M. } j
else
+ f( q1 X' U @7 f* J, E
{
+ l6 q/ l6 ]2 L. @! L
printf("No effective message!\n");
4 f! I! i( l% h# J
}
J' N' e4 y+ K" c
}
, V, J% m1 j( E$ G
$ I i- u0 L6 c: N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 t9 w" J6 ~$ `9 T) i, S; t. Q
7 i0 C- X+ g( H7 |' d" Q0 n
. ~9 H! {. O. I- h# {8 R
1 P8 ]. t4 |- S& m( o5 e8 K) P
# ` ~, J- M) s: W& D
欢迎光临 嵌入式开发者社区 (https://51ele.net/)
Powered by Discuz! X3.4