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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , c" T+ {) L4 b- k" N3 W6 ~6 X3 o
: g/ m3 G$ ]: _$ f
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 D+ s! e$ u# q0 M4 T0 _#include <unistd.h>
- \5 a9 ^8 I: z6 Q6 s8 _#include <sys/mman.h>6 p. e/ Y% j9 l: g1 Z6 N
#include <sys/types.h>
# f$ o6 j* g) {* ?#include <fcntl.h>  ?7 v* [- }: {5 L: u2 }+ ?

3 {; ~) R! F3 }2 c#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 r2 e8 ~; T+ d

7 S8 e9 i% j. |/ gtypedef struct
7 g7 A- x6 u6 T/ n; J{1 V! Z+ s9 A" x7 b
        unsigned int a;( A. F# e8 e0 @
        unsigned int b;% V& S1 c( ?% @: N' ]6 e3 ~
        unsigned int packet_cout;
( p# r$ ^2 j. |4 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; u) |2 c. V4 ~9 a8 k6 ~' R' M3 A6 t
1 h" M# y" w" X' H- Q' v6 X2 a4 J: nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 a: ^4 Z1 b; t9 h% X. B# P
unsigned int count_copy = 0;
3 k0 u0 r0 ]5 S" O9 Y* S+ _+ V# {+ b( @5 o1 K% n
$ f/ W$ a' e6 }- ~% @8 c$ J" X- W+ t
int main()
  I6 m1 x3 C1 v" x1 E! [1 F* a3 Q{
1 b  w  P, B0 n& Q        pRX_MSG_PROTOCOL pshreRAM = NULL;% K; r: C  G, h) e7 ]
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ v" ?% c; b5 L% k0 K

0 Q9 V, K2 f9 u( O# E1 ]        while(1)
+ Q9 K  K4 |' J% I; X; z# O6 s! N        {, l8 s. Y- w* G$ p9 w8 l& ?
                read_MSG_buffer(pshreRAM);5 B+ Q6 R; T9 w3 ?# p: U1 k+ P6 B
        }               
/ L2 p2 g4 X; \# @}
1 Y% w: L# H: G' `0 }7 F9 L# K
% }0 b9 f4 R2 I! [" n5 Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 l7 b" U" ]1 j" v1 C" f
{- ?7 v$ B/ E3 \1 n7 q* `' }; @7 }! M
        RX_MSG_PROTOCOL buf;
1 P( x' |8 @# S. \1 f        
  T! u: s0 H! [1 A" o" ^1 X4 j2 \, T) b        buf.a = pshreRAM->a;
3 w1 f5 i. G0 L) y9 R  S; g* X: W6 W        buf.b = pshreRAM->b;' t7 s' c2 S" a% j! B1 V
        buf.packet_cout = pshreRAM->packet_cout;! Z3 T( \2 L0 c! M7 N/ m7 l
        
$ L. U# ]$ V1 ~7 T( n        if(buf.packet_cout != count_copy)
8 s9 e$ r% q  q8 N/ e/ W        {
+ m9 M/ Z/ ^* E9 H, M/ n& g- H+ Q                printf("a is %d\n", buf.a);
. z/ W) j2 M. V5 g! B2 D                printf("b is %d\n", buf.b);; c, T5 H+ O4 z( N% Y% r+ ]
                printf("count is %d\n", buf.packet_cout);
" }# v4 z7 p+ x% G& B                count_copy = buf.packet_cout;# y  `5 ^+ v1 w5 R/ `( D7 e
        }
( F% Y+ N# O% c: E( P, K& m  h$ k8 g        else4 m; F& {8 B( M$ }# m  `
        {
: I3 I. v- r/ l                printf("No effective message!");
$ G: W; U& B  @# y; \        }. J' m8 D  G# ~% C
}, H1 {+ I- C) E' P8 M

+ w9 E* Z% \7 ~. ?- h  e3 H( g0 x9 S7 N$ U/ K7 v# O7 k8 i2 h6 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 i/ u2 k: F4 g9 a
使用下面代码,对内存使用了mmap函数后:  M: i& B# W9 f
#include <stdio.h>% G* p7 S) P" s2 U
#include <unistd.h>
* l( R; I( N9 _) a! s2 K3 I#include <sys/mman.h>' z. G6 _' b8 t# v
#include <sys/types.h>/ D( }6 t, m7 @- |
#include <fcntl.h>
$ n8 B, g9 ^% [, i+ e  B3 N! u7 j5 l
#define SHAER_RAM_BASE_ADDR    (0x80000000)
* p0 j( J' l: i3 x' V1 q0 x& O5 t#define SHAER_RAM_SIZE         (0x20000)   6 Z3 [6 ?3 R0 ^0 K' R" j
7 t7 w* Z. [  \! o7 D
typedef struct- F7 f- m( S- ~6 @/ o0 |7 X
{
" j3 H+ W4 O& s; O- z) X        unsigned int a;0 C! A& {- z# t" J' v2 m
        unsigned int b;
9 N2 N5 d  T/ d' X4 {        unsigned int packet_cout;7 G' W4 b) x8 z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 {0 t/ j+ Q1 M8 {
" l# r% n% W% W% b$ R) z( }void read_MSG_buffer(int *baseaddr);
" D0 [4 `- X1 D# Cunsigned int count_copy = 0;
; x( l! L' P- O  m/ F0 Q
4 c3 C# d( V) `# o+ Tint main()
! L% J7 @4 H2 [8 g3 H4 w% k$ u1 q{
9 {9 F& j7 W3 f  Q, S% u, ]        int fd;
% ]1 @" L0 \( i, ?: N        int *mem = NULL;
# y+ y' G9 ?# v8 A; b2 _' w. t( n( o& U& q) G
        if((fd = open("/dev/mem", O_RDWR)) <0)
& p9 T: \' f4 ~" B$ M        {) c+ \8 o3 {+ w+ o( A2 i
                perror("open error");
5 u- `6 `- O6 O% y" l- L; t4 L/ J                return -1;+ g8 e" F! C& K2 r
        }: H* T3 H* |: @
        2 C# K2 ~: [4 P* G4 }
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& B4 o1 c6 R; N0 z& {
' {  j0 ^( e" y
        while(1)
4 O4 b9 q" R( B9 ^/ [' l# M: b5 Q        {4 V" x/ R% O/ h5 R" _* d3 x
                read_MSG_buffer(mem);
+ W! }, ^$ u" N6 I: b        }               
& ]0 ]6 X: L! f! w0 g}: H5 L% {8 c# u# \; G! T7 s
/ y4 X# X0 X1 j! f) r/ ^
void read_MSG_buffer(int *baseaddr)+ a* E  d1 P2 R8 ]# m7 E
{8 t% m8 N# @. \& s! F6 X: A
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ Z2 F; X) D1 V' M) C; b* {7 n
% r  c" }2 L3 D/ l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# a( [: s+ M7 w. v/ |

' o$ Z  w! d# _: i) D        if(pshreRAM->packet_cout != count_copy)
8 J4 O- i* d( Q2 d7 V        {
8 d% O  ]% V6 E                printf("a is %d\n", pshreRAM->a);
* C7 }3 J% o/ Q4 @                printf("b is %d\n", pshreRAM->b);0 P8 c: E: ^, `) @8 S5 v3 p
                printf("count is %d\n", pshreRAM->packet_cout);4 e# U8 R' v' Q
                count_copy = pshreRAM->packet_cout;
3 t" {1 @+ Z( i" c4 v        }
3 ]5 I/ r" f3 f$ e        else
" U* V2 F' O; G/ K, j        {
' @& h) A8 a+ V* f                printf("No effective message!\n");
2 s4 e0 r- T  L7 h# J        }
3 g, ^0 B- S$ ^/ E* E& M, l( l' z}
- a% v. @. n& c( M: m: G1 }1 A% O' {+ u, l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! }" P0 w; M+ J7 v7 q5 ?) w5 g
5 |( F4 M- E1 w. @5 ]3 z  u7 r! z9 e. ]; J! a5 A& `4 m

( f8 y5 P& [" W9 f' O2 x# u; y2 f( q1 x- a2 p) I0 j. d; c) X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 01:14 , Processed in 0.037328 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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