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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! O) ]0 M2 x  q# t+ Z
% d3 h& Q; U7 _+ x
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( E9 Z5 v8 V- z. f1 E
#include <unistd.h>- W- e$ u( Y" [3 L; M. [' d
#include <sys/mman.h>
/ x. j& i/ D/ W# i( e#include <sys/types.h>2 x; e! C9 E5 Z; D3 \4 J2 P3 w
#include <fcntl.h>5 S- x5 j) @! y' |" A3 g, O
  ^9 Y: t  ]/ @0 x
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
* a& |7 J' M# e: q5 H' }1 H/ P8 P4 E5 \; h) L
typedef struct
2 N1 s. w1 v1 r{+ M! [) D) M+ }7 Z* y, W6 b
        unsigned int a;* D: t5 d$ b. a# `! @: t' a: r+ ]
        unsigned int b;9 w4 W9 x$ }) R9 J2 J
        unsigned int packet_cout;
1 U. y9 S6 ?8 ^5 ^9 i" b( _}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) }8 i: a' T* m

0 D3 t7 y$ Y7 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 y) s* c  J# [0 O
unsigned int count_copy = 0;+ P# A* [$ i2 A( S* f  ?
' C3 n8 x/ ?) w
( o7 Y4 y( D6 L; Z9 ?
int main()% o) t: q, d- ?* [4 i& K
{
3 p- Z& t& H1 s        pRX_MSG_PROTOCOL pshreRAM = NULL;7 U( s! q/ h4 q$ Y* E: E+ x
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 u% H; q2 {; v
' t0 L4 m8 }) E- U        while(1)
  C. o6 @# w! N        {1 b0 _* \6 y% l! T1 Y
                read_MSG_buffer(pshreRAM);: k7 e+ c: v) K/ K3 k: B4 O
        }               
& l% v$ h  ^9 e2 u) Q# r}% s0 z* S5 W5 _+ y

; @/ R6 e4 @5 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 i" K# `" r3 A- v
{
; P1 P; x8 R% j; T  Y        RX_MSG_PROTOCOL buf;
! K# L" ]8 V7 W% z# n        7 X) a( P0 K0 u9 }! S
        buf.a = pshreRAM->a;, [: n: f; X2 u0 |8 q
        buf.b = pshreRAM->b;
0 {" p# \  L* u4 b        buf.packet_cout = pshreRAM->packet_cout;& n2 s$ G4 v' |8 q( n
          r& G+ ^! a) v$ f8 F$ y7 }
        if(buf.packet_cout != count_copy)2 D' W+ T+ F* p$ R' a
        {
5 ~1 b! I! K$ V2 ^# ^; M                printf("a is %d\n", buf.a);. v  x& ^/ v1 O. t. r9 r; W- m
                printf("b is %d\n", buf.b);5 V4 Z: f4 z3 F6 Q& r
                printf("count is %d\n", buf.packet_cout);
5 _+ V  v2 J7 P                count_copy = buf.packet_cout;* u$ r$ |6 ?; n0 D! a
        }  f+ s6 B( H! D* F( x6 W
        else
# B2 U; y) }9 v. Y: O        {
! B" H( G: Y- N! P                printf("No effective message!");9 q' {  W2 J; Q! t# A+ H6 H
        }  t0 G& E* J1 {* a, x- K, g% _, _
}
3 s; J2 F: k4 `" h2 o% i
' d% W3 Z0 e- D" V$ k6 k, m# H# n* t
4 ]: M# I% ^) D- A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。5 f4 z, l- C) I
使用下面代码,对内存使用了mmap函数后:7 }, C2 Y6 o% B' y: ?& Z% e
#include <stdio.h>
! R, V8 D( M, L' `# U#include <unistd.h>+ g7 H  X* b. K: N' V/ H# a
#include <sys/mman.h>
7 _( E: T. d# ^9 \4 H2 `#include <sys/types.h>4 j- p! l" Y9 B' C  E/ A
#include <fcntl.h>
$ z. j4 u) w7 J
" P5 i9 _* w  _! M' h#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 N& q' L5 {* S: [/ X$ L#define SHAER_RAM_SIZE         (0x20000)     ~. v* |1 w; m! f! ^) m
7 ^# b2 S% u/ B" K+ m5 R; N" k
typedef struct
* m- L' E0 Z3 G% p  }{
5 L' H" A. W) M2 f        unsigned int a;8 {% E9 m$ E% f1 r/ p2 \9 m/ |
        unsigned int b;
( q# p+ y) U% L: }/ D        unsigned int packet_cout;; S8 }+ u  _7 e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. T4 _- W- i* G6 m4 i
) P2 h3 q( M5 g9 M0 e3 Q
void read_MSG_buffer(int *baseaddr);
- s" s+ x1 Q1 L/ Q' d& Runsigned int count_copy = 0;, v) t/ ?! U5 m/ e' b

) j( p4 s# d7 n6 C6 `" n# kint main()2 j( _0 ?. _! x* ~
{& k$ Y+ y1 ~: Z  O+ D
        int fd;7 p& f" W  c1 a4 B
        int *mem = NULL;
5 D( Z; T; Y$ r7 C+ Y3 `
+ y7 O; F) o3 o" A' A        if((fd = open("/dev/mem", O_RDWR)) <0)6 j  g& i0 I) E# E) b$ @: n
        {2 h' r/ d$ G; ?& I: H8 e0 b
                perror("open error");
0 f# s- M- u/ _+ w                return -1;
8 ~: q9 N0 s1 }" S' w: c3 n        }! Z4 r3 N# G; b2 B% j
        
" e+ T$ s% D& H$ x/ \$ f  U3 x% K$ G* f( A        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 P* l) E6 n6 T' ~6 r! c0 h6 l
/ ?' P, e" B7 h: o        while(1)
: n  u5 v2 N% Q6 D! s( O        {! e6 H; V; c+ T/ ~$ T
                read_MSG_buffer(mem);5 [: q# |, G. y8 T
        }               
3 k2 `+ d: B) A# D  M' s}- F. C5 n9 {8 O3 X
& U; `0 X+ O9 {0 s5 l+ I7 v
void read_MSG_buffer(int *baseaddr)
  u3 x1 n& g7 h* L{+ p7 K8 V! X% z- u3 x* N: ]. }
        pRX_MSG_PROTOCOL pshreRAM = NULL;
# z: w1 F5 q. `/ U+ j0 B
" Q, o9 g1 ~  }$ N) b- P0 j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( w+ q7 G: }7 ^* ]4 z! i
$ U# S; H, b- o  `        if(pshreRAM->packet_cout != count_copy)  r$ N2 O% ~4 T% L7 W
        {2 i& C+ f/ e4 t. X
                printf("a is %d\n", pshreRAM->a);# t1 r5 ^( P4 S# k: R
                printf("b is %d\n", pshreRAM->b);- [! J7 [% M& i" `9 g
                printf("count is %d\n", pshreRAM->packet_cout);
( D) w5 C. w/ u- A4 R                count_copy = pshreRAM->packet_cout;2 b% c& S5 J: e7 ~$ F' R4 {- ?6 R
        }
" L3 b8 d& R8 v        else
/ Z5 ]/ [3 _) W  M% N- {( y+ E        {# Y. v% |+ b5 k0 z" I
                printf("No effective message!\n");: S2 L5 ~- B$ ?- J" [) S+ ?
        }
) g/ y6 A9 R1 U' f}
# T3 g2 h$ X2 D/ A9 `; P0 ^" g' u$ T. l( G2 \* {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ @2 F& D" I8 s  U2 {6 x( V2 T/ \6 A- q8 z: d1 S2 t8 q
2 \  ^7 Z. p1 m/ ?: ?- ?& }' o

, V7 ^9 ^, Q% W: X+ t5 [  Y  Z& U2 y4 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-26 07:18 , Processed in 0.045163 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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