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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ s3 W+ B4 }& t/ R( t5 d) a
4 O7 y1 A8 I* R4 vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( L. J, b( }2 T$ q+ g# C" s% s
#include <unistd.h>7 ~: o4 z) i1 A# Y% n
#include <sys/mman.h>
9 U* P) M+ q8 h' d# M: |#include <sys/types.h>5 t) j4 B3 X, _2 Z+ c4 h
#include <fcntl.h>
2 o$ U3 k' Q1 c$ H$ S! G
& W5 z/ t8 F7 Z; y#define SHAER_RAM_BASE_ADDR    (0x80000000)     Z0 b2 B- o& o! R7 r/ s

4 V) y, D8 h! L' N4 y1 h; Vtypedef struct  S' T5 Z4 @) i- V3 f/ e9 R: j0 Y0 D
{
/ P0 R. P0 m  U1 y. ^5 s4 c! a$ [        unsigned int a;! l1 {4 f5 c# q# f9 r- L
        unsigned int b;3 x4 p) r; a  S" l% V
        unsigned int packet_cout;5 X  j! ]1 V+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; P; g- o6 i3 M. y. ^

. R: o5 |' c+ i1 C7 R0 O" q* dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' m4 P* q* c* h0 p1 y" Wunsigned int count_copy = 0;
$ Q) q: `8 z  E2 j+ s2 a1 X; A! |0 M- z& M

" C# X0 D: n! a& O+ J" Xint main()
3 [+ ^9 P7 X+ D, D9 Z6 u{
' H9 [2 t& i6 q- e        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ K* {! |/ h8 O+ V# ?: k3 r0 K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* q+ D: M3 p) P7 e( [3 O+ q

- @3 U, h7 X+ F8 Z        while(1)
) H+ E% `3 [  ?( ~6 Y' J        {( C! @" r+ V& Y+ `+ W* I0 E% A
                read_MSG_buffer(pshreRAM);
$ I, |$ [6 V6 u        }               
- G! [; w* k) q$ E* u. _8 F}: P* L. d4 x2 q5 `
7 o( B/ u& [. Z: W+ f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 k, q* f: Q* _" g& m  z
{# Q3 m7 a* ]; u) W$ L" |& P
        RX_MSG_PROTOCOL buf;
: w2 T! Y1 i2 ]& E# q4 s# D' \4 n        
9 U6 L/ N- ]6 u2 e8 o        buf.a = pshreRAM->a;
- O8 m0 B+ v- k4 ^/ G7 B4 B% H        buf.b = pshreRAM->b;$ V. a8 B+ |1 X& |
        buf.packet_cout = pshreRAM->packet_cout;
- |/ A, P( }, }2 N0 F        8 X7 ~1 f+ ?9 S3 a
        if(buf.packet_cout != count_copy)
' P, v* d6 [( Y2 G% p$ ]6 I( _2 t        {* W1 S1 ^- a, h0 n8 W
                printf("a is %d\n", buf.a);
% d) C" w# p8 b/ c0 h% N                printf("b is %d\n", buf.b);
, U- o- l# g% S- v! d/ Z9 z, E                printf("count is %d\n", buf.packet_cout);' f5 o7 z5 {* z" G/ E/ G, p
                count_copy = buf.packet_cout;
# t/ G, u2 M( U. B' N        }+ _$ z* n* {: _$ B* \1 l' V
        else
5 Z; G. O, t% c        {0 j5 p7 L9 N2 f" h" J( ?) l% e
                printf("No effective message!");$ @( B: w) h1 m* S8 `5 a
        }
$ @' m7 N$ S9 u6 j4 N}
: [+ }, i3 S5 b; u
. J- h9 E: k& }0 m; B- C- p4 r; u/ C' Z& q" z. d& A  d6 e3 D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% Z' C2 k% ^: M  I1 F) [; a& A使用下面代码,对内存使用了mmap函数后:
+ b# X2 P4 I! ]#include <stdio.h>- ?, Q* x0 J7 _2 D# [5 t/ @
#include <unistd.h>
5 n* H) n7 M- \' T! b9 _4 t#include <sys/mman.h>& F, T. [2 p& Y9 q6 B# f
#include <sys/types.h>
. B- m5 L( M, s& a#include <fcntl.h>- D. ]: u" q  u! P' a$ t
$ [! l2 t  n: A; z
#define SHAER_RAM_BASE_ADDR    (0x80000000)+ h6 i% ?, M/ ]3 c/ w
#define SHAER_RAM_SIZE         (0x20000)   $ C+ e0 R7 T0 T8 J

/ ~$ o  p2 T4 y: L: Ftypedef struct; B& C" D4 ^  P
{
$ `5 y+ a8 ]2 M5 P$ Y9 H7 w5 q; m        unsigned int a;
+ H+ h$ r* P  o        unsigned int b;
- ?( h" W0 {- Z9 z- O        unsigned int packet_cout;
$ x# W4 O$ a6 R7 g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 O& {9 ?- v3 \  A5 m# L8 t7 G& P

5 m( X: N5 B$ u5 W- R; y: Fvoid read_MSG_buffer(int *baseaddr);
  D. i  u7 X" j+ o! q% kunsigned int count_copy = 0;
! \; C5 P1 I* V/ c" ]( M2 a5 @3 P
int main()' h4 `) ]% J6 e, Y, Q. g
{
, W/ J* u- p3 a& x. _6 o$ l        int fd;
/ z4 F% i4 ~3 S$ i& p- t5 _        int *mem = NULL;3 p: P( _: X& ?6 ]8 g

  D( s3 `  h( m        if((fd = open("/dev/mem", O_RDWR)) <0)
/ z5 c0 R0 Q" G) j        {
  p* ^! R/ j1 |2 u                perror("open error");
5 Y! z. H% _% S9 T9 \, X                return -1;, R' g& k* C: l! ^6 ]/ y& m
        }
( p, b7 T9 O( v: L- w2 }/ p* j        2 ]  \8 ]7 G# p2 E% l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' I" t8 p2 p3 F3 K& f
% X) K' z2 l  Y7 M
        while(1); k5 k4 ^* {# L$ _9 P% d
        {
/ |/ u. b) c: e9 W5 M: M                read_MSG_buffer(mem);
+ m9 ]( j% J/ e  x! g        }               
* c) \' v- {- \6 i}
  y! O4 \8 |; M' g6 s; i4 g5 x+ b$ R" g$ c( R
void read_MSG_buffer(int *baseaddr)# `0 X) L$ q% ]: F
{, l1 A( O; D$ J5 j
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ f9 v3 n3 w# g" q& i% V$ I5 r, c

" I8 U, H$ F' b        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 z+ E; n8 \* c+ d" u' p1 m/ t/ @' T" h' o* ]
        if(pshreRAM->packet_cout != count_copy)
, e% w0 @1 Z; g$ r4 o        {
5 Y" p  W' D: K; U# M; w, r# D                printf("a is %d\n", pshreRAM->a);* t! ^0 I5 c( }& ~3 J
                printf("b is %d\n", pshreRAM->b);; R6 ?1 j# x& O/ ]) ~; Y; x1 A1 {- T) R8 O
                printf("count is %d\n", pshreRAM->packet_cout);6 ?1 ^4 t& B9 ]7 L  Z
                count_copy = pshreRAM->packet_cout;
* d5 n9 f& G; N; p- l, I        }) t* i; X5 c% c7 U+ p$ F8 r+ b
        else( d( x. z4 ]) K- n* i- T4 H
        {5 {- u! L' I3 y/ ~
                printf("No effective message!\n");
# V5 P9 Y5 Q/ k9 S0 \' s6 n        }
/ D9 L) q* S& G6 p}
1 \& }4 V  {. ]. X% i3 z/ \) c$ y. L( i( A+ o1 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, P# D& H$ N# H7 x' b; r
( S5 L: l. T1 r4 U& I+ P
, V% S# ~% J; i" @8 k" A; Z' ?
8 F  P# M3 Y+ s* @3 l$ z: l" A* ^) n0 v, w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-14 19:09 , Processed in 0.041219 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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