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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , ]1 \8 E* j1 I7 C6 N7 s- q

7 T. w6 d3 Q- _" L- rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! V% v% Q/ u; P! [' j5 s
#include <unistd.h>, K& x8 @; K5 @* L8 k9 G5 L
#include <sys/mman.h>" I+ B5 i( ?) q* ~) ]9 Z
#include <sys/types.h>
5 \1 f# Y) [& j6 z& B) L#include <fcntl.h>, N; n" X& K7 C2 t# w% L# p

/ F1 O! N5 R: \' H- b# y' K" y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& L( G9 k6 ]. x' n$ e6 ]$ e2 j+ V$ ]2 l& V, t4 o
typedef struct# L. \3 k" L8 _/ B* X" F
{% S1 E; B/ L9 b9 v  B: \$ F
        unsigned int a;+ @' t3 @* O7 w
        unsigned int b;
0 }. }  W% Y1 R  }1 O: u        unsigned int packet_cout;. o" ~# ?7 V& ^; K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 \. M  m8 m. Q3 l
+ ^' f; |) U3 s( M) D5 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* G  u( E2 }* |$ u
unsigned int count_copy = 0;
' o, _  X! Z; C/ }1 o5 E1 l5 I6 J( _3 R" I
# C  B0 J% n7 t- G
int main()
9 e  w: i. g1 H; O{
- g3 j$ D7 I% m- O9 {( ~        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 p9 f& P: h/ w* ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 I$ C; B# c. l: X8 J4 H/ ]
0 @5 J6 C2 C( C        while(1)2 u$ c* L3 Q" g' k7 T& O
        {
* O+ y5 _- w6 a( u/ e                read_MSG_buffer(pshreRAM);
' ~( B9 J: t7 B. H$ i* J' }        }                1 C0 m- Q2 P# G- Z; x. m9 E  V
}
- @/ q2 [4 Y& Q4 q' e1 T; T* w
+ w/ b3 E/ Y4 i% {& [; c0 Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% w5 h1 v: s1 s: ~' z& x$ N
{: d7 s: A# z- l  a2 f3 u
        RX_MSG_PROTOCOL buf;( W$ J$ I# M7 H. e/ [: K' S
        . J# \+ O! ?7 C
        buf.a = pshreRAM->a;
+ t# {$ h! G3 T; Q9 z! h        buf.b = pshreRAM->b;
  S$ I! X' ], k: N        buf.packet_cout = pshreRAM->packet_cout;  V: b% M- o% i/ y# N
        2 ~. A1 _2 `( F! E/ `8 `8 u
        if(buf.packet_cout != count_copy)
& W* w0 r, c# Z  X        {
% c  M  ^+ p$ Q& l) `& I  }# f                printf("a is %d\n", buf.a);
9 L' N3 U! k" h2 }! d$ x                printf("b is %d\n", buf.b);- V9 i" {& b  d6 K: k
                printf("count is %d\n", buf.packet_cout);, n$ w! y0 G6 i. t" c* p) k
                count_copy = buf.packet_cout;! Z/ c/ ?0 C  ?  B
        }
9 l1 J! P* B9 x2 R: G1 n) `7 H        else! ~' q! c' v. t4 }
        {5 n, O' `& ]5 `* w% d
                printf("No effective message!");
8 G! e( n/ W  A2 x        }
8 B. ?3 z" T3 g! g, n2 G}
5 L9 a; c5 P: X- J5 T! [# I; W$ H* \
9 l: n# J% S8 A* n: L! k- M0 e. J& X5 C4 A
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 `1 ]' C& a$ ]9 ?使用下面代码,对内存使用了mmap函数后:
" [! w3 X' k; U0 \#include <stdio.h>  F: P$ G! ]$ d% x% D
#include <unistd.h>
3 f9 z4 ~& K" w7 f+ z' ]#include <sys/mman.h>9 [3 b: c6 |2 k, c  q1 g
#include <sys/types.h>
# B7 d: V. p( }* c  }& A! K5 X/ C#include <fcntl.h>, Y% \  P, F; Y2 G: h/ i+ n: |+ Q" F. e
4 }3 E: J  y: H# O5 e, |9 [
#define SHAER_RAM_BASE_ADDR    (0x80000000)3 ~( f: ^6 b9 o) O
#define SHAER_RAM_SIZE         (0x20000)   
" @6 c7 K9 _- m) H' m
( |& r% d! H( h( B; t. Gtypedef struct
* D2 E. m4 e# d: Q5 ^{: G$ Y1 T& q$ d
        unsigned int a;
+ O% F4 D" ]* e- ~* c  g! B        unsigned int b;9 G( b" g/ N+ W# [
        unsigned int packet_cout;
$ U! Y- q1 H7 O" i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) V  t0 d$ Z2 C" @

9 i) e' e- ^' Y4 jvoid read_MSG_buffer(int *baseaddr);5 t, a* a9 F, ?+ [( R4 G/ ?% v
unsigned int count_copy = 0;: O+ D9 X6 ^, a1 x$ E: b! R7 L

" I/ n) q- X) X) k! ?2 d" A! e; _2 cint main()
- G* p" q+ C* q$ v, R9 {{
- Y2 D  n% t7 ]        int fd;
9 f$ s8 R9 W; E' q: S        int *mem = NULL;
& y0 c) o7 |3 @$ U" p3 C0 x. E& C8 n* @3 l4 B5 P$ g
        if((fd = open("/dev/mem", O_RDWR)) <0)0 l% b# X5 c) y* U5 o/ P
        {1 s  ^& B( I* ~) A- M/ R8 G( e9 Z
                perror("open error");
  C6 ^  d; b9 ~( ]$ F                return -1;
7 f) @8 _' p9 X# |' {( s9 y& n        }
# f: q4 J# z! v( E7 K& k- e        
+ x3 ~5 p. Z$ c- k0 d( Z! f; Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 [8 b, ^) J% ^  E9 o
( t, g, M7 x  |; `2 k. O% O- \
        while(1)
3 K6 y+ @; m1 V$ m* G  O5 l. x' u+ m+ G        {+ A0 x8 d+ |7 `; L, I6 C0 f
                read_MSG_buffer(mem);
! t1 ~1 \: T$ z5 M7 x) G5 l        }               
/ L8 L$ |* X) y* w) r/ }}
  f# T! ^. o+ J! s, \; c  W7 j/ d2 N) g- ?# }( b
void read_MSG_buffer(int *baseaddr)$ m, e% @  S. ]2 o, ]9 @3 ^4 _
{
) B" ]3 s6 N0 J8 u0 U        pRX_MSG_PROTOCOL pshreRAM = NULL;# Q3 b, o+ Z" f/ f( V4 {1 c* X4 Z( F$ G

# U$ h, S0 b8 o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 i8 P% L& @$ e: N. c

- a: a% g% ^5 I( u3 {! t' H# M1 W        if(pshreRAM->packet_cout != count_copy)
6 Z9 ~8 D7 z) P        {) y: Q1 W/ Q: c6 K" j
                printf("a is %d\n", pshreRAM->a);2 i" m; f2 T! s5 D
                printf("b is %d\n", pshreRAM->b);
: k) u) T4 {' b) Q& V                printf("count is %d\n", pshreRAM->packet_cout);- j# J' x; Q6 G$ T* `! ?" s! J
                count_copy = pshreRAM->packet_cout;3 }0 p+ `* H5 t) g5 |, [, C4 e
        }5 f. i& I6 W  i' R. O7 C
        else* |5 v+ m# P! [( k5 v1 X
        {
: o/ ?  U) h5 s; M3 E                printf("No effective message!\n");
9 X7 r4 t9 u. N) J, J( t        }
6 f" v3 O; Q) o, v- J5 t7 Y}( r$ |$ S8 f" G  x/ q) o

; W) w& [# d! q) N" B. u" ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% v# r% E) I0 W2 V! N* X/ d6 A% w/ ?% P4 x( n3 M
& m5 D9 R6 q; S% ~' E3 e" t

; X! l7 ?! e( N* n
- q2 G! e, S; E' D! t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-21 17:51 , Processed in 0.040229 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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