OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4259|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 N% P8 [, u$ k* v9 z7 T6 Z( k1 l9 I+ a2 O$ ^* h/ [& f) h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ _3 v, x% a7 M8 X5 t
#include <unistd.h>
$ e& ^. f+ q; p2 T6 ~" J! K#include <sys/mman.h>' O) O/ Y* r3 d8 M3 L
#include <sys/types.h>; k* r2 q3 Z4 j' h; |$ n0 ]! I
#include <fcntl.h>
% y2 z& E# W0 B* I5 e1 }; i: ?! ?- Z- O( {, O
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , F% A! n* ]5 K/ a2 T; [

* v" S" d" ]7 ctypedef struct
9 [4 b2 y' C& l- }{
) d/ h# ?( [9 J& a* E        unsigned int a;/ w2 ]: M- w1 _: E* q( v; [
        unsigned int b;2 x( X3 ?% l$ P, P9 ~4 y
        unsigned int packet_cout;5 [" x1 g# n; F6 d4 D1 G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 j- P& K& @1 u8 x' ]. b6 R* f$ X2 j4 I! N" D7 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, P' m( Q0 N6 V5 a: w. lunsigned int count_copy = 0;. ^2 |& }7 D# d3 _/ M# V: [
4 q7 d- d( a# J1 L! f/ _) {
. I- d8 u- Q! k
int main()% }: ]; [/ k+ Q; o+ ]
{3 R. d0 u$ X" T
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 e! D' j- u3 D- j. ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) J' D) t) W& L3 G$ }) l7 _1 a. x% W" F6 I7 A, ?- ~) j! s
        while(1)
8 A8 Z% F% s7 _- e% U2 t, Y" d1 E        {
! d$ Z3 U* E- {                read_MSG_buffer(pshreRAM);
4 \  k& E- w0 M, d8 [( q        }               
: X' \( j  o' m$ n1 U/ q. F9 ~$ D}3 r7 E6 b2 E8 H9 O, e

: K+ X  n. N( u) W1 r9 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 {+ g4 S* T( r8 G{
$ F+ {: P0 M& _4 l        RX_MSG_PROTOCOL buf;, M7 e0 n% l, N, J
        
; e4 F+ [7 c$ X+ ?; Q        buf.a = pshreRAM->a;
9 s& t9 v3 O0 C2 m        buf.b = pshreRAM->b;% ]5 x7 T* n) n$ L' w8 v
        buf.packet_cout = pshreRAM->packet_cout;) w( Q4 Q2 v- U2 z  g  l4 J
        
. u* B$ H& C1 j1 i8 d2 S        if(buf.packet_cout != count_copy)  e( X$ T8 K; h! p
        {8 i2 G6 {% g$ R! `
                printf("a is %d\n", buf.a);' \7 H; K1 E) N9 }5 P9 ^2 m' v
                printf("b is %d\n", buf.b);
7 M4 f7 }- K9 a9 n- k                printf("count is %d\n", buf.packet_cout);0 o; p. c% B  @: ~! ~) a5 J
                count_copy = buf.packet_cout;8 r- l* `5 ~9 F5 L% v5 k% U
        }# f# M* A; T; t. T! T1 u) H& o
        else+ x- X5 q8 u, f" }% }
        {
  g5 x0 ~, M7 M1 p  N+ i) z, j# S# m                printf("No effective message!");
9 O5 z5 _, i# k! F; l5 k1 i0 _        }
  V+ U2 Y3 t& }' `. B; ]}
- a3 ?; Y& j' C- s+ N$ W# I0 D' \$ ?; N+ R  G; J/ Y% y0 k0 Q

2 i7 K  S, u- P2 f9 V) n. L' _: m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 b* N0 |: v. I* P/ Q+ M使用下面代码,对内存使用了mmap函数后:
! d: x2 T4 A1 @: A9 C#include <stdio.h># H. |8 z0 p# Z6 _. y
#include <unistd.h>
5 O, D1 L2 `' c# G$ ^6 G- b#include <sys/mman.h>
. }" i6 W8 l. J) r- I% s  y  |, x#include <sys/types.h>
# ?3 Y+ s$ [* H, n: Y& o6 k; u#include <fcntl.h>3 `. X1 l% t7 d! G3 U( K
1 D: C" w! u& s, ^% [* r8 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)' |$ S, i6 _! i2 Y# q- w
#define SHAER_RAM_SIZE         (0x20000)   
' X& Q2 m8 ?+ \( h& @. n0 {0 K" P' i2 d$ e
typedef struct
1 p+ J7 z8 ^7 p{- M. b/ A0 w* S4 E! c  E
        unsigned int a;5 E( E- Q9 ?2 c) L3 ]+ g3 V, U. X
        unsigned int b;
5 ^6 b$ Q/ [2 S8 i; t        unsigned int packet_cout;+ ^+ c+ G! U  D% O2 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' E* K0 x4 m* k7 p8 d+ u5 V
' y8 w7 ]  r" t# ~void read_MSG_buffer(int *baseaddr);# q  Z8 \  |" Z4 {# E/ G& Q
unsigned int count_copy = 0;
0 i6 ]+ z$ E. j9 c: Y' H, M+ x. E- T! A) v2 N5 N
int main()
% q8 f/ k  C5 ?4 f& D{- k" h  S5 S# o" x/ a- ^2 v
        int fd;+ }7 W- [  {+ A" r# v- w: W& a
        int *mem = NULL;
# J- A2 w/ Y3 X* U7 v0 l$ x# Q3 l
' a7 J( i5 @5 f' D. G: b- q$ `        if((fd = open("/dev/mem", O_RDWR)) <0): |* ^4 N. c1 ~& g7 Y2 k
        {
' r- b2 G' ^+ E) p$ T  X                perror("open error");
: r* b$ B% o6 F+ ~0 y+ Q                return -1;
. M( q8 b/ P1 M& b& v' U! N        }
$ h1 A- C; D. W1 Y        
9 ^% B* e; X; N( B5 d* E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. }! t! X  @' b0 h: ]7 F# k

  @- i/ q: P- W+ ]/ g        while(1)$ G' T3 d4 d( u5 o" a" ]
        {
# k9 s7 M* @9 q9 @& j4 L                read_MSG_buffer(mem);' @0 w3 V, T0 [( Z
        }               
/ i- p  y* ^, ^' z5 Y9 m0 s+ v}( b* y- e& K1 D2 U

* _2 v: J7 c$ T  {void read_MSG_buffer(int *baseaddr)% |/ g6 H$ _6 K6 B2 a
{' T3 A6 x  L6 V( N/ Q; E
        pRX_MSG_PROTOCOL pshreRAM = NULL;! Q; X. E5 t1 G8 t, o
1 w; ?! @9 S: W. i& b9 _$ N
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ U5 I0 b* N+ h7 T3 c
* N: W! N) c, c( R
        if(pshreRAM->packet_cout != count_copy): v  k7 o/ m5 t+ S9 o
        {* W6 ~. A, p4 O
                printf("a is %d\n", pshreRAM->a);6 p- d! |6 f6 D$ \9 b0 n& |
                printf("b is %d\n", pshreRAM->b);
. }6 S4 P9 q1 }4 f% `                printf("count is %d\n", pshreRAM->packet_cout);/ \$ l& r$ X8 V$ V, _# d$ ?" ^
                count_copy = pshreRAM->packet_cout;$ c" E. o; V. z  U% f
        }+ {! ~9 @. p- J3 @# y
        else
  W' G8 i8 M, ^) t+ V0 f( W        {) Q! D4 j, ]9 r- f* @/ |
                printf("No effective message!\n");" b7 P) X  K  Y( p- c- A- |
        }! k9 T3 r1 V/ i- e! y2 N7 l1 v
}
" l( w- a0 k' ^" x+ b+ I' E9 g, W& L  U$ ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& U$ M5 z/ X- l$ ^2 F- k9 ?$ n5 o* C

8 |) B( L: O3 A' B
( o5 }/ M' H4 k' Q+ T8 ^. }
0 n& e. a8 r  }6 e, q% u0 ^6 ?- S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-4 16:07 , Processed in 0.035595 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表