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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  u4 o% ^/ R% ?7 X0 n- }' x$ u/ O% n) M
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" O: s4 {) o6 u% Z#include <unistd.h>
0 s' a  n* d; N. Q9 ]% Y( @& |#include <sys/mman.h>) s: I1 s7 _* L) \- L' c
#include <sys/types.h>' x2 z  }4 y4 C. g0 ]9 D; N. F
#include <fcntl.h>
) M6 g2 o$ |; G8 s8 |
2 d9 A+ B- |7 S#define SHAER_RAM_BASE_ADDR    (0x80000000)   % E  P' G9 m& e$ j2 v7 O1 M. u

" y: A+ r- e/ [- ]typedef struct
4 L( E' j: @5 v9 \3 E7 f5 C/ `2 [{# _. d8 f: V5 W# Z4 _, u' _3 `& I
        unsigned int a;9 ^( G0 {+ ~8 Q: c+ v8 f% _
        unsigned int b;
( A/ T. J2 r  h        unsigned int packet_cout;- a) Q2 u( N1 C) r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Y$ |$ Q* g* T! T* b8 n1 k0 K

0 T! a7 c. j" I1 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
2 x' t' N! n6 U9 Bunsigned int count_copy = 0;
9 m) Q% s: s7 p, d( t
' H2 n: X( O2 m% {* ?7 s/ z2 s4 ~3 o% S- t+ f; X+ a
int main()
9 B! m) O4 u3 [. O: G( h+ g% `9 }{
) w4 j" `% e' i0 T* r  R7 c: ~        pRX_MSG_PROTOCOL pshreRAM = NULL;% T" L  Z1 h# s: a
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% A  B$ K' Q0 l/ K3 D# y
* w( W; o$ \, R$ _. `7 y9 ]        while(1)
' w( r& [" F- _! G, m5 l6 t  N        {1 g) ]/ ~9 i$ P  w* c5 s
                read_MSG_buffer(pshreRAM);, M2 J, ]5 m/ F% l( x4 j! d7 k
        }               
" F5 ]/ x% [" y3 {3 x3 X}
7 T! N+ x- p+ n2 c+ c
8 x0 F( j+ T  ^* [# X/ S& ]void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 W" x/ }8 F; u{; f; E/ t" C+ s5 U3 O; {* D5 Z0 T
        RX_MSG_PROTOCOL buf;
8 |- _. X+ @4 Q# g9 n! Y" g% g        
  g+ _" D1 S1 K% K        buf.a = pshreRAM->a;% V' |% r7 s% p% z1 Y
        buf.b = pshreRAM->b;# V2 z+ G4 B1 f# [# p- z" P
        buf.packet_cout = pshreRAM->packet_cout;
5 Y5 v; o% v7 |5 F# R  J6 C        + O! L; g$ f# q! L) x8 ?' H. H
        if(buf.packet_cout != count_copy)" |+ G6 {3 y! {7 C* M  ~
        {
: t+ n- t2 z/ z                printf("a is %d\n", buf.a);
& Q" h0 C5 T( T% q                printf("b is %d\n", buf.b);- ?, T$ J$ [6 a" Q3 M5 [6 E
                printf("count is %d\n", buf.packet_cout);: m5 R' H' d6 n9 Q# U# c6 `
                count_copy = buf.packet_cout;
0 t7 F' b, F+ Z& I/ k        }! n  p( a* [5 f8 z6 y
        else9 `3 Q2 d3 T* p( ^# @+ `% ]
        {
6 Y# V. G* t- _6 X9 }2 Q                printf("No effective message!");, O+ y" m% n: f% H. T: d3 b
        }2 z+ n9 U, k, o7 ]+ S: k
}
9 [8 F3 T0 w4 x* G) Q$ ?% ]" L0 O) P0 a

! @" p, A4 C  o3 J但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ H6 ^. Y3 d9 Q$ M4 ?
使用下面代码,对内存使用了mmap函数后:# Y9 F: ^+ J% T/ ~2 L1 b5 K( y
#include <stdio.h>
4 n. }% v3 y, I- D) e- P#include <unistd.h>
8 R, F- W; }2 r* x% K9 p$ K#include <sys/mman.h>
% k" n7 D2 y6 K#include <sys/types.h>
( x' J- m1 I& o9 a/ N/ \#include <fcntl.h>+ ~0 Q# N- Q% H5 R

' w' D9 z# z% M- b( S#define SHAER_RAM_BASE_ADDR    (0x80000000)2 O0 ?9 S. u: P( d2 I
#define SHAER_RAM_SIZE         (0x20000)   
# m& ?6 `! m% W* k% ]+ T3 g4 S3 }( l& Y( s4 J+ O: h4 o( X
typedef struct
  T& H4 Z7 s( N7 F( q3 ]{
, a4 v" [3 [% i$ x  i3 a( E# O        unsigned int a;
, C" G4 a) P$ j4 Z) |9 S+ X# `1 ~        unsigned int b;3 @) ]3 k: Q5 v" [, Q5 @
        unsigned int packet_cout;" p$ ~) B# ~* Q, q$ Q" G- R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, u" C. f8 y8 n3 k9 W/ `4 G# S* W! k  f+ ~  W9 S9 _
void read_MSG_buffer(int *baseaddr);
1 N1 s3 H& `# }  Wunsigned int count_copy = 0;3 [; V6 T4 G7 j) {/ P3 X9 {" [# `

0 ?6 D+ G7 Y4 U) A% d4 u, M& Aint main()
; _8 e5 w5 e& r/ Z; d2 F. Z{
9 Q0 V: E; D1 o6 x        int fd;& e7 b2 k# T: U6 A2 V
        int *mem = NULL;
+ l6 s: {# Y2 p: y7 X+ ?$ c8 q8 S+ N0 V! ]$ @
        if((fd = open("/dev/mem", O_RDWR)) <0)8 M% ?& L5 Y! b$ c7 F! Y
        {
" z8 D6 K4 T) I' K) n                perror("open error");
, J' j# o; c- d  r: J1 O                return -1;+ y0 m$ o3 N( e: x' g
        }
) ~3 p! a( d- ~+ k9 o+ x        - Y: [2 n6 s6 H( l& f$ {% o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 q7 Z) M8 x& J3 o# o. e" \* @

3 a( C) u: ~, {. Z- g  O        while(1)
: _' ^( o( {, R0 u        {; B% s' `7 V" I+ D4 d" T) L! L
                read_MSG_buffer(mem);( f" E) N% f3 t/ ]) t
        }               
  }& @, M! s. h4 O5 \7 S}
7 U6 L; P; ^! K. B9 a5 X0 o$ ]8 j" f+ {
void read_MSG_buffer(int *baseaddr)
1 T/ M$ L. A" k: q, E+ o{
( c, I* S( @* \" {, T! `        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ |* Y; y$ q" Z) e4 r
+ H/ J- y  |! @' C% i3 f        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;, `# T' s) F9 e
  R+ o8 K) @7 C2 S" v: i
        if(pshreRAM->packet_cout != count_copy)' `: H5 ^0 J% O& V. v# D* C
        {
+ N+ p' R6 \3 h, i                printf("a is %d\n", pshreRAM->a);
# f( v# o  g2 r9 ]$ o                printf("b is %d\n", pshreRAM->b);  ?. f5 ~( `" X. m9 t8 T  j
                printf("count is %d\n", pshreRAM->packet_cout);# }+ [0 {7 j8 U. x9 B0 Z
                count_copy = pshreRAM->packet_cout;- h7 O- g7 U6 _
        }
6 Q& q4 U! O, J* l* L5 w8 A        else
  W  O2 S" r0 e# L! E        {9 ~1 @3 `: o+ n6 ?
                printf("No effective message!\n");
$ z, O- }, g4 G2 x+ r7 L        }5 _8 H: r6 F1 M4 T2 J: t& c9 K1 q
}8 |- l. I& G7 U; T9 W

8 j  \- y# _  w7 ]( c6 I; A, @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 b' q. f7 e$ [5 s% S2 ^& B
0 s( b5 F3 R' @3 h2 [( l2 x- f
$ n1 v. d% V% h. d1 @7 T. K
4 \1 b( @( f: B( g5 F" o5 r( E4 y8 X0 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 08:06 , Processed in 0.040250 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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