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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! a( u7 u1 h) b& m* C8 H4 s5 P% }" ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- v% P* T; m8 D8 Z: t
#include <unistd.h>
6 k: G+ g3 i$ ^( e  P#include <sys/mman.h>
. b' `# n/ P$ n" L4 k" h#include <sys/types.h>! G# ]$ K' j9 U; K5 [6 C- p2 M
#include <fcntl.h>! }8 t0 H& }" ?/ @% z" ~
( p9 b( ?, q1 F/ {1 k8 f6 v
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # G- x  g7 D# [! `! b0 V! G3 j
& a* }( `" C7 z6 F6 G
typedef struct( C1 r( s) e, o' b: {* _
{
1 p& g0 k5 b" C/ D5 \$ l5 c        unsigned int a;
3 O' `2 W( {9 w! a. f        unsigned int b;
  {8 L# N2 E8 E/ q! y0 d        unsigned int packet_cout;
; ]# J, n7 f$ B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 j  I2 p. b% X/ i0 M# F& [0 n3 f5 v; p2 f/ S" J+ A0 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) g' m: j3 h8 funsigned int count_copy = 0;3 D* M9 M+ l  b8 ^2 j

" J" J8 O, V0 o2 `
8 G2 u  c, m% ~( }8 p5 a1 j! F+ y8 J; kint main()
3 N9 P1 W6 v& X' ]0 g- ^, G9 q5 p{: l* q" ~, q: t: _9 V( H# m
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 t& ]( |: u$ p1 Y1 `
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* @& s" `4 |1 x- p

" f$ J" }8 d% D* }) {, I6 S( ?* U        while(1)
& D7 B# S, v/ U        {( q# S# y0 E; n1 U6 v" U
                read_MSG_buffer(pshreRAM);! _' k. \* J8 y) C" q6 e( M
        }               
+ J1 i; ]# F( T}
& v4 E1 k% S5 ?9 k5 @& t- h" R* U' [+ L. z0 ?3 y: o! h9 \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ d, v$ Y$ b7 Y- O7 B{6 m$ E! x, D' U
        RX_MSG_PROTOCOL buf;5 J" k3 h! c+ V9 Q: {  ]
        
) @% p) M4 {/ A2 N$ L2 b% S        buf.a = pshreRAM->a;
: Y* M* d, s9 |3 Q+ v$ B+ E' J4 |        buf.b = pshreRAM->b;/ Y# r5 g0 X' Y4 C2 e! j- W
        buf.packet_cout = pshreRAM->packet_cout;* J/ A. C9 p% a4 ^! z. O+ ^/ C
        
# q! z+ Z# h* F( Q& A        if(buf.packet_cout != count_copy)) Y3 F) ?- }: G6 o. @' ?3 |
        {
- @0 Y) |$ ]  r2 ~! E- R) x  E3 W  C                printf("a is %d\n", buf.a);( J  {) t- |& D1 p! U+ B7 o
                printf("b is %d\n", buf.b);
6 s1 Q( h" x% u( O                printf("count is %d\n", buf.packet_cout);
' G+ I2 E" e; u" v! ^( m                count_copy = buf.packet_cout;
+ p9 p  S  G3 q5 g3 n        }- B/ i* L$ D% D6 @
        else
# J1 h1 R! K: i5 q6 |; T, ?        {7 I3 b" i0 L3 ]8 }0 K
                printf("No effective message!");  L# R+ n0 c8 A0 Q7 b% H. h
        }4 n. G. u/ h+ r, n
}
4 u; P4 \! f" ]5 l1 a
, ~1 o$ @4 l" c# s: k$ U- Q- s( Z6 w9 M5 t. a7 g
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& O6 D7 r  K6 U7 S& t! P
使用下面代码,对内存使用了mmap函数后:8 P5 I8 M- c4 N9 C  }
#include <stdio.h>
$ e& d) E8 T+ d' X#include <unistd.h>
8 }" l2 n! f3 j- J  X#include <sys/mman.h>
! a: X4 |; j$ }0 }" L: M& H#include <sys/types.h>
1 q( ^- G, P+ e. C1 W#include <fcntl.h>  z' ?! l& L5 p0 n5 h9 O. @6 y

3 z' g& I$ U% [$ y) o) [6 I#define SHAER_RAM_BASE_ADDR    (0x80000000)  D( b- r4 W# u! ~; _
#define SHAER_RAM_SIZE         (0x20000)   
6 ^5 a/ F0 ?1 W3 Q: L  @1 W1 I  ~/ m9 q* @. K! f$ F( R. f: H
typedef struct
7 o4 U8 i3 X7 w* A4 b8 T{4 {- ~2 z" \" B* A+ U! O8 \
        unsigned int a;! Y4 m- e. S$ M. h1 N
        unsigned int b;
! W- ~: w! y" c5 g! ^5 N5 U        unsigned int packet_cout;
3 R' D0 O4 h/ a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 w3 J% b9 i) E7 c; ^) q. t
, ^. U6 h. \6 t2 R! s3 A$ M
void read_MSG_buffer(int *baseaddr);
6 e5 h, _1 u" T3 cunsigned int count_copy = 0;
; H" s& C9 w+ [* M+ m' t  J! j( i  y3 V( E6 L8 `
int main()
% ]+ K  w# N9 ]5 W, R: f, w{) X6 K) C( u+ F' p2 u; _
        int fd;$ u# \, U, o: y& A2 n" o
        int *mem = NULL;
& h( W: g9 y! }  H1 X) i" M! d/ N( ?" Q  X; ]
        if((fd = open("/dev/mem", O_RDWR)) <0)
  P8 w8 ?* N+ {4 y9 ?9 K6 z        {0 x2 Q0 B7 ]! {1 y
                perror("open error");
5 A- f1 C0 P0 h8 o& b1 [# e                return -1;* }$ @* L" E) R$ g5 q
        }; `" l- E* u2 g# q
        
+ H. Z3 N# S2 t) I8 }        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 j. t* Z4 ~% V0 F+ _
1 {3 C- [" t% K3 O* v( x
        while(1)
$ F2 e8 w  w- C: _+ D        {
3 k2 ~: m2 U  i; x1 c# M                read_MSG_buffer(mem);
7 G( \( U( @: U3 P( _- I: a        }               
: Z% ^5 X9 v  o$ }2 }- P}
5 G/ X/ [% Y6 ~; B& N
. [! j/ t) j9 _  U; s2 D7 bvoid read_MSG_buffer(int *baseaddr)+ _1 U2 e" K1 A" J$ C
{
% L' d0 w( w' A* x( y! I        pRX_MSG_PROTOCOL pshreRAM = NULL;
. s( X8 I+ ^' r) m4 t( J: Z; @4 i( U$ ?
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ V- C$ C6 X3 S6 R. t  ^

4 F# j8 q/ G/ _3 l2 ^. K6 p/ y) M        if(pshreRAM->packet_cout != count_copy)
8 W$ z% T- A8 q- y  X* u4 [        {
& }. e: j% {; L: F/ H5 y                printf("a is %d\n", pshreRAM->a);% h7 L, r' g% v- d- L5 B' Q
                printf("b is %d\n", pshreRAM->b);0 n( W* z) j1 S0 G9 B, q1 K
                printf("count is %d\n", pshreRAM->packet_cout);
' x' ~+ x+ H$ z                count_copy = pshreRAM->packet_cout;
& r7 m: L5 M- t& ^  y2 z1 B        }
/ x4 M7 V- Q$ k, V8 [+ ~        else
5 y- r6 d( }6 `0 W        {
# `* d5 U1 J  _- v                printf("No effective message!\n");5 `4 ]  t; {' n* \
        }
1 x( P: F# @+ B& N# v/ {}2 ]: k5 |$ z1 J8 E0 p( S6 O2 @* }7 f

: O1 L, l. W1 H5 a/ J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: k& R0 ]4 ~, _  ^6 s8 v; _
1 }- t% b6 b. @* v' p* y( K0 F" O: E# X7 F; T: K3 M

2 I0 U2 {7 _  U/ @7 b/ k5 B7 j# p2 z) e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-31 19:38 , Processed in 0.040467 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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