OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 \3 T& ~5 ?. \. s% V
3 s7 ^9 U# k  `/ t$ G$ \3 bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! u  t/ e* n5 B: O- t3 |% g) ^#include <unistd.h>
# n( ?- {+ |2 v1 W! n#include <sys/mman.h>! g! O1 r+ I3 H4 a- A' b
#include <sys/types.h>5 k4 f* O$ m: h" @0 w( j6 P
#include <fcntl.h>
0 l" U# H$ g5 ?4 }) R  \( e( {) w" P8 _2 U8 @9 q5 P
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % f5 r1 p; n4 f: _

6 {: X# A! }  i# A; _+ Xtypedef struct
: H* c4 @. o; c{
# i2 Z1 {* a. ~* ?        unsigned int a;7 T, f% r5 F. B
        unsigned int b;) G4 Z8 u1 x9 |  }3 N
        unsigned int packet_cout;, `3 u6 ^' X$ M; D( x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# r" g1 u! I9 P2 i" f
* l$ P  O7 ~7 `; u5 c0 r" u8 Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" u3 P6 @9 d2 R' V8 ?: F9 g
unsigned int count_copy = 0;
, O" ?  }6 a; J. Y2 X0 [" N
+ b6 z5 m; c* f
+ v, b/ V- r0 K; O* l" c3 Yint main()
: ~( ]/ }2 n6 D7 q0 x3 Y{
+ d5 b/ [$ [1 ]1 H        pRX_MSG_PROTOCOL pshreRAM = NULL;( u* q. s0 t5 b: M. B3 H- N
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; \' P! V3 A* S& a3 Y1 N* j
: T! ]. W9 C+ R5 u1 z) [3 c        while(1)- E! e# z# u" ?4 Q+ @# j
        {
3 a' f/ y$ f# K3 m) o- f                read_MSG_buffer(pshreRAM);
7 _- G4 ^% V" `) h7 b$ {3 |        }                  @& U8 q; k( S7 e! x- _
}
8 a5 J+ J  P6 s8 {
* ^0 `$ N. k9 N" y; [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  [4 T8 H9 q7 j' b+ Y2 v
{, k  l. c" u2 G) Z" `5 a1 ^9 ~! X
        RX_MSG_PROTOCOL buf;
! J2 P- w5 n% p3 J8 L; _        
4 V2 F! g) [+ |# b  S6 _        buf.a = pshreRAM->a;
( X  ^7 C. U2 g5 K, }/ L        buf.b = pshreRAM->b;- B' W; T4 N. N/ N
        buf.packet_cout = pshreRAM->packet_cout;4 K# z/ p1 [7 b8 S5 |
        
" A: I( W* }" h  d* E! b5 m        if(buf.packet_cout != count_copy)
- s/ o8 |) Y7 [  O( B        {! e1 c* _& L7 X8 C4 U$ x5 \/ i% c" d
                printf("a is %d\n", buf.a);
* n$ d5 c- Z7 T8 P                printf("b is %d\n", buf.b);
# k% I! v/ k8 t                printf("count is %d\n", buf.packet_cout);) S( H: @0 \8 b( q0 r$ V, S* A) W
                count_copy = buf.packet_cout;
6 {. Y) A$ \9 h8 g9 O7 l4 K0 z        }
, P3 P( N# d8 ^' _5 ^7 e+ x        else" r1 R* y/ @4 d1 C$ u
        {- R. }- I1 ?2 m) |& Z3 H, E7 Q/ A  u5 i8 x
                printf("No effective message!");
# Q7 `  D- f' G0 B# v. O& O$ p0 \        }, x* |0 _+ r; N  G( F- o$ p' E
}
, E( ?$ S6 v0 Y) R& p1 e& A7 F$ w1 V. V& l3 R

4 v5 o. @6 ]9 X1 [" J. ~" }; U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 I3 _: D5 f2 y; I8 p6 A8 L7 ?使用下面代码,对内存使用了mmap函数后:# y5 A% ^, z# z' R/ \6 F; a
#include <stdio.h>4 U9 q  Q+ S) l& Y2 h
#include <unistd.h>
% \! _1 n0 N  ^' I) T6 r4 C: j#include <sys/mman.h>
( l& H) I  y3 }#include <sys/types.h># A8 m3 P* B  u# l# F
#include <fcntl.h>" A3 }+ q  s# E" |2 }% r

7 \/ W" p; t% f* N: o: v! o4 P#define SHAER_RAM_BASE_ADDR    (0x80000000), }$ _% m, H; N
#define SHAER_RAM_SIZE         (0x20000)   
9 A+ Y& x' M6 F8 z- _% @
5 g6 |8 x: z6 M, z/ _* J+ [typedef struct
/ T$ r1 D# u! z) J' s{
, @$ p$ b' h$ N+ y4 j. m0 O- s        unsigned int a;
6 j* s/ h7 o! _$ i0 y6 e! h        unsigned int b;- y+ {6 l8 m, _2 ^
        unsigned int packet_cout;8 M# \# r5 B4 A% V0 H# `* K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;8 a* `6 c. Y, W2 I3 j' c5 e* _: f

! ~# n9 _, U+ F! t. r0 a* w  X/ x4 wvoid read_MSG_buffer(int *baseaddr);
% y* A3 T1 f+ Z  {/ L* Runsigned int count_copy = 0;& u) d5 Z+ Q  `# v" |
7 L4 H) `" i" c$ D: Y0 `* L
int main()
8 w% j( W! Q- r  Q{
. J  I& l6 H) W7 X  k        int fd;
4 H6 ?* N( @- C1 \        int *mem = NULL;; E8 J7 k, L  s

- k5 j- L. |) f- p- D        if((fd = open("/dev/mem", O_RDWR)) <0)
! w9 L/ t  J1 `  x0 ?7 c        {# B' F$ H, ~$ [5 C& e( L/ Q7 a
                perror("open error");
- M) l" ^2 N8 G                return -1;
& t. a. c' `4 O! P, C        }) w; ~# H( I* ?7 w7 F( h
        
0 W4 W( u8 L* _* Q8 y* O1 u7 a        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  H1 Z8 w8 V3 g+ T! b! X( w2 o0 ^( k6 R, Y9 [& L& j1 y
        while(1)
, H* Q6 W7 g2 x1 w4 O3 ^        {
- f* E! W4 h6 c                read_MSG_buffer(mem);) U, ~- F. t7 y7 |+ q
        }               
5 f7 @' F6 E) @8 N7 M}
- d3 A! m% d( X7 F3 H5 S1 r7 W0 E9 R. Y+ G. W+ V4 r/ n
void read_MSG_buffer(int *baseaddr)) n$ x' W. q: V9 e+ m& T
{# G1 {9 g9 A+ O" ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 s: {4 L+ r' y- P9 l6 U& w4 `: ~
& Z9 w; g  d- b( ^4 _
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  y* S6 r, Q- L1 L- K
5 D7 U1 i5 m. l7 `
        if(pshreRAM->packet_cout != count_copy)
  V& V& T6 K' |& ?5 k9 Y        {$ E. [7 S) w9 B
                printf("a is %d\n", pshreRAM->a);
* H/ f1 S) }. R) {3 y                printf("b is %d\n", pshreRAM->b);
% t* z) k- c: B                printf("count is %d\n", pshreRAM->packet_cout);
: w0 x9 M  a3 P/ G                count_copy = pshreRAM->packet_cout;
% O. ^7 C1 Z2 |1 |4 C, O' h5 ]        }2 F- N  F( ^2 u6 U/ I& ?7 A
        else
8 o# d5 ^6 P4 ?7 q        {2 A! r7 k" n: A) r/ x
                printf("No effective message!\n");3 G& f6 \! k" N) M0 D
        }
4 ?6 J: z) S5 l; ]}# L5 H* z! x% n7 J: \5 m
: j- V/ k8 \! [/ Q. [" M! E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" D% M! W: G& w" y5 U$ Z! f; [7 x) P
) ?8 N4 ?. T# t9 [% d

' b2 x5 x# p$ d# V* L  b9 J8 S
5 d9 n' v$ U1 [; c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-4 01:36 , Processed in 0.046606 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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