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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 G  N) a  `+ Z5 M; A/ s$ s
# z7 E4 T; d2 a6 I7 Z$ l' wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: ]/ k4 B# e9 V* J8 R#include <unistd.h>7 n, x; ~' B, i7 Q7 f
#include <sys/mman.h>
3 o7 D. y5 r7 x#include <sys/types.h>
1 v2 s& C- Q) B6 M" x( ^6 x#include <fcntl.h>
: R0 D" V4 P- m  Q7 ]
- s; p  G+ u8 L& ~8 y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% r& M& |( m( c. \' _  F3 b- y- C5 {9 W
typedef struct
; ]$ R$ X% s1 w. \; s% M{
" T' n3 b7 `- V; \        unsigned int a;8 E* ]% i4 l" \/ W
        unsigned int b;
* Z2 b6 @! U7 W, m1 Z1 x        unsigned int packet_cout;
4 K- D! ^; _, ]0 y3 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. T7 ]4 [9 \- p: c' Y9 J

8 e9 L1 [  j! f9 C- `- jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
+ }* V7 {& u& B, J  Junsigned int count_copy = 0;
4 D, O6 R/ Y4 p/ s. |& N$ K2 o7 L% K  [& O5 K3 ]" R
  M7 u) Y% U2 |' X5 N1 N6 Y
int main()
- j3 p2 `8 i% [4 I# n, E; |: ?{
4 [2 ~6 Z' x1 O        pRX_MSG_PROTOCOL pshreRAM = NULL;
& i9 s7 h, M3 A6 r6 d3 R        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ ^. Y. o% C: x1 A0 |6 I5 o

8 }0 z8 H  e8 b        while(1)
' q4 T* J) k  @" a        {' ]) |' Q. d$ W& W3 f* K
                read_MSG_buffer(pshreRAM);" ~6 i. B; l2 g8 M% T3 q( i& d
        }               
% n4 D4 G: W" q6 Q- g; s1 U. P}. a0 T$ ~9 b1 `3 L% o& b: d3 S; C$ v
6 f/ O9 ~+ |" `; r# F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& [" l! L  o0 ]. }% |2 A# d
{/ _# o$ p2 t7 y. N# f& I
        RX_MSG_PROTOCOL buf;5 l# c1 [9 p- c% }* P
        
  w4 E! n  c- S0 c6 P$ F        buf.a = pshreRAM->a;
# {9 {* k7 r! S# c  [6 K9 J        buf.b = pshreRAM->b;$ [7 ~0 S, \6 z) e) N# y
        buf.packet_cout = pshreRAM->packet_cout;
! h/ D) d, k( D% @( c        
4 W- T: ^4 R; o  N$ L# U7 n        if(buf.packet_cout != count_copy)0 Z3 y( D5 u& o
        {, M) V1 T7 o$ W5 L5 k
                printf("a is %d\n", buf.a);: f  u) J% R5 Z0 d
                printf("b is %d\n", buf.b);
9 d) t) \$ O( F& O7 f                printf("count is %d\n", buf.packet_cout);
7 e) y7 b3 H1 P                count_copy = buf.packet_cout;2 C7 J2 ]9 W& j6 }2 _, t
        }% {% H, |* v4 _8 D4 K' O
        else  X" c$ |& |: T9 r0 Q
        {
8 B4 _3 e2 Y6 Q0 S2 `' H                printf("No effective message!");
/ W, J" h" J; X2 p8 k        }# j8 t5 H& J2 V# {- a7 n% F9 W
}
' C" @; ]& ~' v& q* N
$ R. e! ^! a- w7 F. F' d, Q" ~. {
- E/ k5 M: Y) k6 X3 H( q; G但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ p( m& C9 H) l1 z- C2 p使用下面代码,对内存使用了mmap函数后:
. M4 {& p3 {3 M; h3 Q, G4 D2 e#include <stdio.h>1 Z' {3 H: O3 q$ G' [
#include <unistd.h>
8 G2 u6 c2 B0 @  }" |; M5 l#include <sys/mman.h># M6 l' w) B( |+ \( p5 A
#include <sys/types.h>0 J+ }; p) `( i" P8 S, g. }" l2 a
#include <fcntl.h>
: l9 a7 x( l! [3 A/ g
6 S7 A# X. V# ~0 q#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 M8 u% I0 ~4 `4 y1 D#define SHAER_RAM_SIZE         (0x20000)   7 M% j! {; B# t' \9 H0 E6 S% X* y

$ S0 {8 h& R5 R5 dtypedef struct
8 |7 e0 j' u5 s% c9 n% I; `{. I+ |7 _' l/ a- X1 h6 @
        unsigned int a;, r8 o' s* ?( C9 v% n( T0 R3 y- d8 ?4 H
        unsigned int b;* _; |$ \0 n6 @+ O
        unsigned int packet_cout;/ f- K2 c, S- s4 I# j( X
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 T) D5 a7 \5 `) w

. U9 z3 q, H' h' D, d4 m# G; Xvoid read_MSG_buffer(int *baseaddr);& E& ~( I) ^8 J, x& C
unsigned int count_copy = 0;6 {6 `% u# A5 E# f* M
7 F3 E' w( l0 |( a9 q" |
int main()
  Z5 m; i, S, c0 b3 o3 ~7 [{
6 d  C+ p: _* Y+ d6 x3 v  s2 v( o        int fd;0 t% S% J" m7 F! y8 H
        int *mem = NULL;
* T5 R& a& s& z+ I! `0 [4 N0 L+ V. D$ K
        if((fd = open("/dev/mem", O_RDWR)) <0)5 }8 [2 i, a  J! B' h
        {0 g7 f2 \4 w  h  n
                perror("open error");5 r- Y8 {7 v( Q8 @$ b
                return -1;
4 j4 H  Q8 O2 L& `( y1 D/ Q        }- s, V5 l/ k8 s1 n# e
        4 x+ t0 m/ }/ J  z( e3 J( v2 B
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 L+ T! N- d7 f! a% q8 k! g' y8 }- p
        while(1)4 s( C9 S7 a3 E/ T' k$ u
        {. q+ A& K3 t4 m3 b0 ?3 D
                read_MSG_buffer(mem);
. y" n" R0 W2 F0 [$ U+ v) C        }               
8 D% @: l, b0 p! Z: R" b6 e4 u; k6 o}
& `$ Z8 P- T% L7 ^. \% m5 O; g! M- v
void read_MSG_buffer(int *baseaddr)
" S" h- ^+ E; L$ }. s6 b7 `{8 S9 r6 y2 P, U3 R
        pRX_MSG_PROTOCOL pshreRAM = NULL;! G" J1 Y0 ~* U0 U% O3 L" A
' f. B5 `0 E1 j. Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, K4 d- e. x3 q/ E  x0 `4 x/ R$ @
        if(pshreRAM->packet_cout != count_copy)
( d; A* A7 f7 D        {
! q) I) u% K& ~4 X+ K: U6 l5 C8 U                printf("a is %d\n", pshreRAM->a);# U2 F8 w% k; n4 r
                printf("b is %d\n", pshreRAM->b);
. h; m& m# v! \5 a7 x                printf("count is %d\n", pshreRAM->packet_cout);7 W& j$ L- A# h, u
                count_copy = pshreRAM->packet_cout;9 `0 q( {; p5 ^6 ^9 H: B
        }  W5 z8 c$ v  c. B2 c7 d- @# [8 m
        else; B- u3 [: e3 ~
        {9 E+ F. T( M; G" t2 e" ?) H$ h
                printf("No effective message!\n");% C2 N7 P* \+ {; v9 |( w9 v
        }8 e2 G: z  I8 r
}% b) ^% e* \+ W+ a( D8 |+ V) e9 W- Z

0 C* X7 {9 U7 i/ ~/ V8 J( d3 h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 @+ A& s# c8 h# B- [1 A# h. Y/ ?" V; S  h, G* S
2 D& O7 ~2 i8 Y* Q0 A! \  d
, L: `, z+ A, V3 g- c" ^4 [
# q6 ]; [. v: {# D1 ]3 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 06:22 , Processed in 0.048740 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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