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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& n" _# V; R1 \% {) I9 h3 u
. G! |3 ^$ i7 T1 ?: W  eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 i, P6 x9 [. g
#include <unistd.h>
8 V1 `5 c9 d1 B4 {# H. e/ ^#include <sys/mman.h>
$ T; b/ j# A1 K0 \& [' T#include <sys/types.h>
9 a% R/ B) F( x2 F#include <fcntl.h>7 b) a! f" H, e& B6 |

! O0 V% n# V, ^- o* l#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ L# Z9 o8 w2 Q" p/ y: J+ C4 E! Z5 N: h$ K1 i6 M# @' y
typedef struct8 f8 l& L9 _, Y  ]% E: p
{
) Q% C2 F3 p3 P        unsigned int a;# Z; R) V2 ~6 E5 N# q
        unsigned int b;
; c7 _' L8 z0 c- |        unsigned int packet_cout;
! a8 W1 W( D% V* |' @) \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 t& t) K' D" \' Z, H6 c
" c3 ?$ \9 t! a, f' E: Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 g- p2 F7 I+ Munsigned int count_copy = 0;5 w+ T- f  x: J/ p2 x& D

! K# ]# B$ B  \0 S: A% A- w9 P
0 X4 A5 ~2 |4 F1 \" rint main()2 U' d0 P! \! o
{
5 V. k5 H2 G  E; ?8 o        pRX_MSG_PROTOCOL pshreRAM = NULL;! L) R6 w$ b. Y& ^  T0 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 \  d) {: e) T. q# t& _& N6 a. V
0 g8 D. K3 H4 b" D, ~. C* e        while(1)
! X2 x, T0 o- [        {
$ k9 K3 b$ ~. y: h                read_MSG_buffer(pshreRAM);- e5 j9 n  [( f9 o$ {" M
        }                , s# ]. l  o2 e! }$ Q5 z
}
/ {" M6 u3 n1 [( o" V5 _& d
/ h1 X) q; M! E' P9 C: ^" `$ `" |$ `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 f1 z7 R& p5 @! w; g
{7 O, T5 W! Y$ x+ u0 \, m
        RX_MSG_PROTOCOL buf;
1 L; m0 O8 q2 n$ x( t        + ^+ E4 [- Q. {. I
        buf.a = pshreRAM->a;& ?" x2 g7 `' f
        buf.b = pshreRAM->b;/ g& y' y$ R  N2 e( c; t6 M. L
        buf.packet_cout = pshreRAM->packet_cout;2 v: F* }: _7 r! V+ j6 U$ {! Q
        
/ r% G8 }3 G  ]: N        if(buf.packet_cout != count_copy)
! P9 y% M4 K/ r% S4 g1 B2 f        {
0 M4 C$ ?1 E# Y( G$ N                printf("a is %d\n", buf.a);
& O, J2 X& W; {: g7 A                printf("b is %d\n", buf.b);0 p& Y0 m8 [6 w* M- W2 p
                printf("count is %d\n", buf.packet_cout);. w" [' e0 |* d( O. U* H! c
                count_copy = buf.packet_cout;  o3 v6 A0 P4 u- P
        }9 s) N) o/ V0 d* \! a% H
        else
: Y& {* c  _9 I% l/ ?9 p9 d        {7 ^7 i! E) s7 H: `! ~2 N
                printf("No effective message!");
2 B% Y  ^1 V+ E0 x2 h        }
" i0 U; m: H% R1 C( Y2 L}# {7 m% v& ]$ n2 B+ p: G

4 a3 L& k- ^$ I6 M7 f
5 B+ n0 u% }) |' M; Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ A; l! V2 Z+ l+ j  I; r0 @* |
使用下面代码,对内存使用了mmap函数后:. ]: \6 _" n: O# X
#include <stdio.h>+ B8 X7 r0 E, B$ ~
#include <unistd.h>) B5 L* J* C4 R1 s# P$ A$ l
#include <sys/mman.h>% g  L. c$ c2 N$ |, O' h
#include <sys/types.h>
, J. {6 f4 y: b) N; |7 T#include <fcntl.h>* ^: y% Y* I  T5 L9 x  v

) I" ]' O. W! f, M4 n7 f#define SHAER_RAM_BASE_ADDR    (0x80000000)+ J2 S/ j) N/ M5 R" Q' H4 Z/ S% o
#define SHAER_RAM_SIZE         (0x20000)   4 R/ I/ a( |8 f- R3 G2 j; f
/ p* y) g$ ^* m. F* X0 O8 ~, i! r
typedef struct
$ c7 b9 ^8 n: ~5 T5 e{. f/ K+ `' J& ^( ?4 l
        unsigned int a;2 B6 |9 `& a4 S- {3 G' b9 c
        unsigned int b;
8 u2 T6 e9 W: ~* F        unsigned int packet_cout;9 j  j2 f5 A9 E! y" ]0 E, s( \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: I" o3 f7 M2 u6 J7 m
- m5 }- i+ r+ X! `  Svoid read_MSG_buffer(int *baseaddr);
1 V: v& c+ z" Xunsigned int count_copy = 0;) v7 U* S/ D# x+ K

3 z. c* a5 M9 H' V+ ?9 \5 T0 Vint main()7 n) j8 g! U9 N; l( x) K' z
{
. s: G- i- T! K        int fd;
# U% `! E% S5 Z" D$ v0 z4 t        int *mem = NULL;
- g' ?! J) Y+ }$ E. N0 b5 s* U5 h
, ]$ U. Z- _8 T/ {- U5 Q! |# l        if((fd = open("/dev/mem", O_RDWR)) <0), p  P, D) t1 K9 y* L) L
        {
  c* L6 c" S# \% V- J! J                perror("open error");$ q( f" R0 W2 O9 l4 S
                return -1;3 f4 s5 a- ]+ q
        }8 x6 ?; |6 Y- l  p9 v& n8 @
        
, ^4 C" n* ~5 ^$ z$ E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" z8 `* X- R; M* @) ^4 g

( s( }! W9 A0 d$ A  I1 x        while(1)
+ b. i2 A8 }/ C7 V2 j0 ^2 t        {
. Z% F' i+ J; k+ W- w2 V                read_MSG_buffer(mem);+ s; S1 d6 {- l( d
        }               
, y& r( ]5 {" {9 f- f+ ]}( R( z8 D/ D7 G3 j2 ?
4 m/ H* l. r7 w9 N8 g) n4 R
void read_MSG_buffer(int *baseaddr)) a7 Y$ M7 C" P! g' _( q  ?1 ~
{6 d) ]3 E& H, u4 a2 B+ P8 d
        pRX_MSG_PROTOCOL pshreRAM = NULL;, H, x+ [5 o5 I7 \

+ W* i/ ]3 ]4 ]0 e$ l7 N$ ~5 s: p$ E        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 K, m' z8 O# z( j5 T; K" g( N9 @0 A  R; l4 T3 Q! v
        if(pshreRAM->packet_cout != count_copy)5 {% X& n% L4 K! o" W1 [* Y
        {
# a& `6 P$ ?9 t( [/ N( k( V# n* p; }                printf("a is %d\n", pshreRAM->a);- ?; x9 q1 c+ L: p5 i# }4 c
                printf("b is %d\n", pshreRAM->b);0 }" n3 j9 w  M' Z
                printf("count is %d\n", pshreRAM->packet_cout);3 T9 W: l) u0 S( [: {2 o
                count_copy = pshreRAM->packet_cout;0 V, k; L2 c1 ~" r
        }2 n7 c9 f/ x/ @3 E8 A9 u" e9 O3 Y2 S
        else- ~5 `0 A  J6 R6 w' t% c
        {) y; M* t4 t: Z1 e
                printf("No effective message!\n");9 }0 T  Y8 t' {! e4 L* s. ]" G
        }# ~6 y/ }3 ^' u# s
}* k9 T5 k: _. F: c. M7 a
' M+ U0 J' i# J, I- e; d# V6 c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 b  r( h$ a6 f( d1 T- @
  S3 \8 M$ v/ U0 @, f9 @
2 u  U1 x4 X& K& }
% `* J( c5 ]. W  o! ]

/ ~" Z, U2 n! [) t9 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 18:18 , Processed in 0.037890 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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