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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & }7 p% A/ k& C, W6 o

2 _/ w. W1 I$ |+ c; vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* u# w5 d) O3 e1 r* A; L/ n#include <unistd.h>
" C: m8 O- C4 O3 [: T4 V5 j#include <sys/mman.h>
2 L# o" M6 B0 Y8 c4 ^1 j#include <sys/types.h>% @2 c* `8 w3 v6 U/ P
#include <fcntl.h>: J: X  J8 S6 k$ T

) P$ g& X6 A  Y. n#define SHAER_RAM_BASE_ADDR    (0x80000000)   + b* i% u$ R/ G  u
/ [% {  q3 C+ p8 S
typedef struct
5 @: w" ^/ t5 I{  s+ B8 j- Q, G" A+ U- F2 ~4 e
        unsigned int a;
/ F( H* I* J7 K# u) q, }3 t        unsigned int b;
3 i. t/ m2 O5 B* l! y3 Q. A1 z        unsigned int packet_cout;  m- E9 l0 I- R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 H. N- {' b. B' ^/ Z# p9 o. x2 v' T

3 S& m1 r! N" b; ~1 d  Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 k: K2 N6 ]/ i9 }. R5 Vunsigned int count_copy = 0;, B" H4 }7 c) H! H6 c0 {
! [9 P! M: Z; a; ~" L" V

$ C) X. u8 x* H6 `int main()* c- o( A0 H* t. W
{2 y# x3 [# ~, l9 `+ ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 a7 g% q8 i. s3 W; p6 t3 o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" n: }% g- j# ~0 |& S& s7 [* G) a6 y* e. O. @7 h
        while(1)) @% R, I/ H. T; v3 b* E
        {# h6 V' g% h2 X
                read_MSG_buffer(pshreRAM);, L1 T3 F; h$ w$ p7 ~# O+ h
        }                . `- F3 W& I/ a$ Q6 t
}
/ @! T( A. z1 k9 f9 q% f- E% Q
, }2 \1 c' L$ R+ a4 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* }* B  E. p7 |, R% Z9 Z* `{& l5 T. ]+ l- U+ ?+ r1 c  W
        RX_MSG_PROTOCOL buf;. W# \6 m1 j1 d. b- G- ~
        
- E7 j3 s# t$ Q! b) a        buf.a = pshreRAM->a;
/ W7 s8 f; g! d( c+ k/ X        buf.b = pshreRAM->b;. J; j1 y8 y4 k# h5 [" E( p
        buf.packet_cout = pshreRAM->packet_cout;* Q1 ~/ G+ I5 Z
        % h7 U% B0 P  \7 D9 G
        if(buf.packet_cout != count_copy): Z0 a) x8 J$ [) F3 T
        {0 w4 w8 ?5 `: @
                printf("a is %d\n", buf.a);
: a- p9 @3 i/ T" k  t; I3 Z                printf("b is %d\n", buf.b);
5 v1 p+ X6 J& U# M                printf("count is %d\n", buf.packet_cout);1 w8 |3 V+ B" M9 f
                count_copy = buf.packet_cout;$ Z+ i5 z( ~" E% Q2 o) p
        }
7 |) N* M5 {1 [        else
( ~" l+ S" Q; B6 e) o7 K0 }; Z  L        {$ X7 @% o, }% w, s% G; j! [1 g
                printf("No effective message!");5 p, T* e+ y8 ^2 O
        }: y/ \7 B; z8 I7 h, T
}
$ l  [" c( d$ }; L, f8 z, L" X+ g! b3 _' U$ K
5 Z5 ~3 j$ c. I4 r- ?% T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% `7 h3 d5 Q. V4 K
使用下面代码,对内存使用了mmap函数后:
  I3 Z2 ?% X1 z) E#include <stdio.h>
0 V- p1 d3 Y( t% K: q3 l  ^) b#include <unistd.h>5 t% X7 S  C3 Z
#include <sys/mman.h>( G! a0 I7 d" l, ?( O. h
#include <sys/types.h>
/ T: Z7 r' Q2 e#include <fcntl.h>
- _0 g9 V0 M, A5 {% u3 @! x; l$ J
' w; _7 g4 [# V# V6 u; X1 f. W#define SHAER_RAM_BASE_ADDR    (0x80000000)
% V2 m6 Y& w" `2 O( e; t#define SHAER_RAM_SIZE         (0x20000)   
- Z4 b8 x- S( f4 C, R" p: g# @4 R9 {% v
typedef struct
+ U- v0 G* u0 S, H0 e! y5 `{
" W  o. K! o! h, @; E        unsigned int a;
3 a9 |2 H. i  o3 f* X6 P* C# Q: h        unsigned int b;3 l9 N3 _3 I' `6 I
        unsigned int packet_cout;5 A+ |8 C* L$ h+ n- S4 y  G2 a# l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
$ D, j: S7 |! T7 X: [5 S- ^" S+ P
6 t! ^. K% X# d6 p- w( `void read_MSG_buffer(int *baseaddr);7 n5 {7 {( H$ a' P
unsigned int count_copy = 0;
5 J* D6 x  M& ~8 N0 Y  Q0 l: F" [( W, b6 [
int main()
7 z* h6 U: H- n, `5 S{7 v) B5 Z7 y  c/ p
        int fd;1 w+ Z3 B$ q7 V3 h
        int *mem = NULL;
, L# s- i) n# u, s' r0 Y
1 E# h9 D- p' `9 Y4 H; u        if((fd = open("/dev/mem", O_RDWR)) <0)
& p9 E; i0 L, L2 ?* u        {
& i( w) M" ^( c. H9 U- G: a                perror("open error");8 f- b9 x( {6 V$ ]( T: h
                return -1;
2 x# A" G2 R, E& l        }  F( C6 m9 i& ^7 r
        
. A4 s9 O. O, J4 [& B) V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- K. R5 L0 t/ U1 n

. \2 w' b" m  k, o+ h+ u; V        while(1)' e. u: g% K( y: h# s
        {4 Z! h& _1 i8 I1 l; A" Q
                read_MSG_buffer(mem);: g# w3 E3 k5 w1 |. B+ y
        }                " A. e2 X/ }! h9 y
}5 z+ u6 O. }- L* F* `
4 \" n- ^+ }) q/ E  l
void read_MSG_buffer(int *baseaddr)& W1 h5 B3 D0 R% h9 o2 T
{
% o) Q' Q( L, t        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 e0 a* ]# Q( r7 M3 U; k( m& b* |* q$ s* I: j; I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; O; x5 U/ C0 a  V7 d, s) @1 T
, b8 ^7 v( l8 E: c# n$ b+ [% i: o        if(pshreRAM->packet_cout != count_copy)
; ^, U+ E" R" n4 h        {
4 J3 r* |0 a" W1 Q                printf("a is %d\n", pshreRAM->a);
1 `9 i" U7 I9 x8 Z. J$ x7 z                printf("b is %d\n", pshreRAM->b);
7 i9 I# O1 f" J% D; i                printf("count is %d\n", pshreRAM->packet_cout);; r& V6 m% l4 J$ z
                count_copy = pshreRAM->packet_cout;( p3 Z* Y' G% ^" o' M0 |
        }5 ], h# C- Z5 z$ }
        else2 g  m3 a9 g, ^  ?* n* p; ?  n
        {
; C. |8 {% r3 f/ @+ M- B" [; ]& w                printf("No effective message!\n");
1 j4 e7 x+ L) i' M( e- W4 ?        }
/ a( J5 N2 l0 r" g: j}& i2 `( @4 |# P( ^
# l& S. o8 C' B4 {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; N# i* k, M% ^  D# x7 B; Y5 w0 D" Y+ C- h+ r- a
& J6 x9 k4 F) I& T) A$ u+ E4 h
3 x& `6 `, g8 B% D5 Q
$ k8 L7 ]1 `: \. O+ q2 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 20:41 , Processed in 0.042900 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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