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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 I& L  @$ ^# r3 H: F+ R& T, r2 \) \

& K$ U9 [- e4 ~1 @/ j* oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 t) |, F1 z& s% c& |- `
#include <unistd.h>7 m( S+ N7 l& f9 j+ r
#include <sys/mman.h>
5 W1 T3 G# C; D/ U8 C) d5 f7 Z#include <sys/types.h>
1 V* b- w9 [& x$ W! e7 s! t$ M# z#include <fcntl.h>
5 C7 b5 n" N7 m3 H  t! {( \2 [( u  m$ h8 j2 i! b2 a- ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)     `: K! y, U' t) ~9 x0 }7 Q  d

' L2 e. v! q( E. K" a. i& {+ Xtypedef struct
) k% O, l- u9 N: `& k- E- v5 g( h{  K! p& x& s, D
        unsigned int a;
% f4 T5 {* @7 D        unsigned int b;
* {% T- v; m/ W- P        unsigned int packet_cout;
! A% Z, C8 R& z: J" z" y2 R8 n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 W7 d8 z* G6 |9 ]" M+ _6 d
) T3 M7 n9 T( t8 _" d4 `% hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' N  W# ^0 {# i& n" c/ Bunsigned int count_copy = 0;
: q9 d$ |9 j( Q; O, ]/ B2 |4 q) H3 k8 L! h* Q# l! I) b

. q. Y' |9 G  w( ]0 Bint main()
) t* U8 U' k$ @8 \{  u& Y# P# @/ M7 }+ d2 U
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 R3 g, \8 D6 ?5 e
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* x, I5 l$ m1 w% K) N

1 b- x& G% n& ^) z- }* c/ S2 X        while(1), X3 w" B" _9 E- }* _! C5 k! t
        {
; W* |/ x3 |/ ]0 X$ k                read_MSG_buffer(pshreRAM);3 f8 [! d5 A# p1 k( s
        }                5 Y( h" @5 f/ M8 A) p2 X% x
}* M  }$ w+ W: F

5 O% |8 \0 Y0 [& yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( m, V. W3 p7 J  u8 ?- Y{- [' c: ?) k7 o: M) r! F
        RX_MSG_PROTOCOL buf;2 T* Q& ?6 v/ c) R$ X, C. H
        
+ n1 y- Y9 c6 u; p" H        buf.a = pshreRAM->a;
& Z. {" L4 l4 n6 u8 F* ~        buf.b = pshreRAM->b;# j( C; \+ K2 v" a8 U3 C  C
        buf.packet_cout = pshreRAM->packet_cout;
8 z* l1 d9 ?+ V0 }        * a. n/ Z4 N. ~
        if(buf.packet_cout != count_copy)( t, ^% u1 D' p9 B! \
        {
7 Z- _7 @% T8 Y* }                printf("a is %d\n", buf.a);
5 W/ _/ U/ V4 \) ^  u- T+ O                printf("b is %d\n", buf.b);
6 J( L) ?! J$ _& c                printf("count is %d\n", buf.packet_cout);* v7 p+ N0 M& l& t* [: e) L
                count_copy = buf.packet_cout;6 V5 t9 d+ R2 k9 q; F2 g( P& Y
        }
% T% R8 j8 O9 @. w        else/ B5 d) E$ K5 n7 ~
        {
) r7 z$ @! X- M( Z* F& |                printf("No effective message!");! Z, u  k7 Z" i9 K" b
        }1 r+ Y) z5 W6 j# _: b& U
}
$ j$ b1 ]& K( {' O
5 C& E% b" Q) u* H
1 Q' C. B! L% g1 b5 Q但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。2 h4 H8 n2 [) i* R4 _2 N5 N
使用下面代码,对内存使用了mmap函数后:
) X4 U. k1 k* L( S* r- p! ~#include <stdio.h>4 c& }% t& c* k8 F. R
#include <unistd.h>- i) V2 k, h% R. G/ i/ ?) q7 M+ U
#include <sys/mman.h>) J" e0 a8 s2 Z& m  ?- i, d" }
#include <sys/types.h>& z+ i' v2 G/ ^. }- Z' A
#include <fcntl.h>/ ~+ J9 _8 }' b; i& }; ?# W. v3 M

) D' J' l& P2 \#define SHAER_RAM_BASE_ADDR    (0x80000000)
' T1 _! k" Q* b8 }# t) h#define SHAER_RAM_SIZE         (0x20000)   
8 j( ]7 F$ W: N  [2 o2 t
' S: F7 l( f/ v1 Ztypedef struct9 r# X6 P/ [3 F; M: N+ {  o
{% T- O; B- B4 M4 M1 v% z4 ]
        unsigned int a;/ L6 {, j. w+ q' X' Z8 k8 ^
        unsigned int b;
* B6 E& m* D5 _9 J/ v1 U3 ~' a7 H        unsigned int packet_cout;
6 {9 \0 o! m1 r5 h8 c  ~- U- v3 e2 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! X7 @0 t( U4 _1 o( d) T# j% v- X4 ~# |+ n
void read_MSG_buffer(int *baseaddr);* u& W9 l4 |. h4 m
unsigned int count_copy = 0;
. D  c- g5 u: `% D+ `
5 R! l0 s3 O+ ]; aint main()
" M4 G3 x# H% r+ D! ]/ L* N: D  [{( Q9 \  y1 l' X. O+ D
        int fd;9 {9 s3 p5 {9 n  _5 \0 D
        int *mem = NULL;5 C) Z' H8 A5 I  e, N. P
5 ?2 c6 q" T' E" G+ N
        if((fd = open("/dev/mem", O_RDWR)) <0)& }- p1 t2 ]& r7 g0 ^
        {: `& E) S6 _; d6 P2 T- k; m8 B# a
                perror("open error");
/ l* k5 b' B% x% d                return -1;) A# i9 ?' M# M; Z. ?
        }1 n1 _" N/ s' ?; R1 W  Z
        
; ^; k' U" g0 |/ E, F6 ?2 e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: }' D% O+ w0 F! S6 c7 I5 W. Y9 N8 Q/ L! A, l, Z
        while(1)
; T" l( G+ N5 d3 U$ d        {% s0 K) f5 y0 X+ f5 ~5 R6 q6 Z+ }
                read_MSG_buffer(mem);& w- M5 c2 ^: W2 `/ ~7 T
        }               
6 B4 v5 f& ^7 Y}
$ N5 ], A1 U  E4 h3 w
' w8 ?3 k4 S) _void read_MSG_buffer(int *baseaddr)# H  ^# l1 R* `  j
{9 A& @5 j' s. [, \2 S& I4 T
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 `/ O# W9 ^# S8 A

% e+ p4 w, F/ M3 {! Z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: D9 Y% _, i1 U; T/ F. @! x& a: b: q8 ~: S+ d/ b7 p
        if(pshreRAM->packet_cout != count_copy)* s8 _; V" o; X* I- S6 h
        {# x& r0 b- P- e. C/ r0 `
                printf("a is %d\n", pshreRAM->a);! [; E$ o* n$ n9 }7 k
                printf("b is %d\n", pshreRAM->b);4 |; M1 u2 @" S0 {
                printf("count is %d\n", pshreRAM->packet_cout);
) [) {7 Z" X# Z/ ?% l' B0 D                count_copy = pshreRAM->packet_cout;
! q  v; A5 j. B# s6 P( F        }/ y) c% S. t) ^7 F9 C" s
        else
) s4 U- N+ Y$ _7 D: |' Z- y2 L, S        {; o7 |. r6 g0 {. }& R! ?
                printf("No effective message!\n");, p  Y! h2 c) n8 b1 y
        }
' `8 c' ^$ a5 ?}- Z5 y( L( n5 X

9 H" @" D7 x! V! m3 n2 K# @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' z) P7 Y# y4 e. U$ A. f) E- K+ @+ g: U; W
; C" R! i" X- ]6 [0 P- d
$ {9 n/ @4 F+ K) k2 @

. q5 \" |6 h5 ^! L! y5 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 19:01 , Processed in 0.039960 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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