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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- w+ ]1 P7 u- [$ |8 }$ ?1 F0 Y; h7 B; A% J/ {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, B* {, m) O& p0 w8 A
#include <unistd.h>
- U& X+ ]) S% c+ i, D% P$ s1 Z#include <sys/mman.h>
, R* l# {% }2 {9 [#include <sys/types.h>4 i/ C$ A: c: z5 W1 k8 Q( f- F
#include <fcntl.h>
8 r' K- Y5 h" l$ |$ L- K$ ?; J2 c. ?1 T  C( ?/ R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ h" v2 x2 x4 i# g# x5 T1 F. P7 ?

6 w$ u, d1 N. [# E& R$ a- Ntypedef struct
. W2 @1 e: a7 N' J4 |! t$ y{5 D& d% ^2 _5 F
        unsigned int a;
  t9 c  R- o9 n+ L; y" C        unsigned int b;# C- e2 E5 E1 M9 @0 P
        unsigned int packet_cout;# i1 }' T8 `+ K9 t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& ]1 w  t- _9 p9 k& t6 D3 s) o: K+ T% [0 I( u3 @/ \; q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ b' r" ?3 B2 F
unsigned int count_copy = 0;! L- }: E! ]$ ?* W
& i; V  c. v8 a- L7 D
* x$ Y3 V% P) [6 b2 b* T9 @
int main()- d5 _( w7 O* ^/ e5 K4 c2 `, f
{
8 Q! V" k7 M( W8 M' X, A, w        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 V$ g% L2 c( E& |" e5 S        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 C7 ]+ b' `5 |9 u4 {# B# `7 n: B9 N0 ?" G1 c
        while(1)
  C$ [& [- U- R8 e9 G        {- K' ~6 a8 ?$ [& R
                read_MSG_buffer(pshreRAM);6 d! q; ]" K) w
        }                * C/ A9 [7 L) f/ H2 v5 H% V/ d% C
}
1 D/ q8 E8 N! y: K( Q+ G
7 s  g8 v* K3 G# z9 Z5 F$ dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* f$ w& V1 F+ r$ S+ G' e{
: O& _  t' k9 g- o# f( R. \        RX_MSG_PROTOCOL buf;
6 G& u; [2 c3 l1 R. a        
9 u- Y8 ^) n3 u& F        buf.a = pshreRAM->a;7 ]- U$ Q6 x# Y, Y  ]7 D
        buf.b = pshreRAM->b;- `. o; ^9 c9 {- \$ n1 A* ?* z4 g
        buf.packet_cout = pshreRAM->packet_cout;
1 {) W5 z0 Q) O9 K        5 `$ c5 T/ g- T% {' h9 j7 l  a
        if(buf.packet_cout != count_copy)/ X) B9 j, v/ }' Y" y) ~3 V
        {; b: \) M- B4 ?$ n
                printf("a is %d\n", buf.a);
' q6 r1 A' ?) B                printf("b is %d\n", buf.b);, _' s9 V  p' \0 O
                printf("count is %d\n", buf.packet_cout);: J# C' F7 O8 N" F, @
                count_copy = buf.packet_cout;. o) C5 F0 D; s
        }! u6 U* v5 r7 t# Q+ R7 h! V* i
        else
6 ]2 W! u1 c7 C6 X2 R/ |( j        {
" k* U) f/ g8 W, X' ]                printf("No effective message!");* P" [1 B9 N4 I8 `# k2 ]
        }
2 s7 C4 x2 K2 b$ \) I}
/ ]2 o* t: }4 D1 {. a# y8 i
; n: T, s- }* W# @! i7 y& [5 |& u
, k1 j' z1 G1 l5 M+ F  M但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. S# V% A: U8 B2 x6 Z使用下面代码,对内存使用了mmap函数后:$ [$ f$ l' K9 q
#include <stdio.h>  {1 {9 H! U: ]2 o
#include <unistd.h>3 h6 P4 F0 E, ^# v! ~) S5 c
#include <sys/mman.h>6 S/ f* g/ l) Q0 u, n% L0 X3 Y$ W$ g
#include <sys/types.h>; t0 h. h1 P' \
#include <fcntl.h># J  h6 R$ r  `2 N: {
3 z$ o+ r6 _" ?; {3 l
#define SHAER_RAM_BASE_ADDR    (0x80000000)# D0 j$ t: X8 Q
#define SHAER_RAM_SIZE         (0x20000)   ' ?# o/ r. {( {2 I; V

' N- _2 q  ?8 }8 T/ f, _# Ftypedef struct. q) K& d& w& h  z( j  x; ~
{
0 ]6 T% r% u( u+ l2 m        unsigned int a;
3 t0 ?& {& f6 s5 X) t0 t        unsigned int b;
) W* e" Z  T% e9 S0 m8 p' f        unsigned int packet_cout;
! ]5 t% X- n4 ~: H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* K' _% b. }! q9 D7 Q% M& G

) M2 ?2 i% O! Q3 Q0 j3 J2 Avoid read_MSG_buffer(int *baseaddr);
0 e6 d/ s3 `) ^* N) y4 v; D6 dunsigned int count_copy = 0;
) m9 {6 K6 A& j  d* X' A! ?* i7 r4 T
int main()' }% O% L& f2 L" _; H
{
6 B# \; V- }" x0 |6 l4 K' w  ]6 b        int fd;
$ R# [2 E- g, J% F        int *mem = NULL;( D+ \6 H  `' D3 U3 A
2 |! h7 R3 o: f  f
        if((fd = open("/dev/mem", O_RDWR)) <0)
& D7 j. z" g# V- g0 i        {
3 r: \( x2 I; W0 M                perror("open error");7 ~& I" c. @7 b' s
                return -1;
) X, D7 c9 |2 n5 N3 W9 Z        }4 B7 a7 w9 P! K. E7 n/ c
        
) ~4 a0 ^0 l( p$ y0 n+ D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ ^  V( A0 W" a1 q) B' n

  L8 a7 D' x& @* n9 Z        while(1)$ y8 X  A0 e8 [2 z0 e1 @
        {) K2 F, B) R! Q, _
                read_MSG_buffer(mem);
1 a8 p! L0 ]" T        }                + l; f, Y* _2 s2 y0 N# a  K4 J
}- a  G- |4 p$ {% `$ Y# h

0 k" L! B$ k1 ^( ~. N4 Jvoid read_MSG_buffer(int *baseaddr)
* D& c+ T1 Y3 D0 W- L{
, @7 j6 A+ K5 s( ^  ^9 t$ S1 w        pRX_MSG_PROTOCOL pshreRAM = NULL;' [5 q2 G9 m8 I. Y0 q
, h+ S1 H9 }. r' ?$ T2 J( c3 d* g7 Y# E
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 ^' b% J/ `$ d" W. m& G! W; f; ]; Y
        if(pshreRAM->packet_cout != count_copy)
/ }: I0 m+ V1 E) ^        {
9 C$ c0 k  A& i/ V1 s* N                printf("a is %d\n", pshreRAM->a);
% K( g' l' s' V- k! {. f                printf("b is %d\n", pshreRAM->b);( k  T. ~) R: [/ ~% t
                printf("count is %d\n", pshreRAM->packet_cout);
2 o0 x# q& c8 W  V0 O+ Y+ B                count_copy = pshreRAM->packet_cout;
1 {8 l% {9 h' T# j        }
; Q2 P  m$ S. P) a2 k        else0 {8 W; A) I; k5 t  T
        {  k8 @; Q" x6 g3 _3 O6 P' k; I
                printf("No effective message!\n");
2 T5 ~  `- p  F2 s( t* O        }/ k0 D9 T. p1 K0 c$ V- q
}
$ H+ Y8 f" P7 d4 K: [. S0 z
3 n6 `& v  V# S: N3 w, a$ l' G) g3 e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) J# a" \: t% M9 @

2 |$ T4 \- C. v; c
3 U+ \' f% x/ Z( w6 j; |
' I  ~5 M, _" e0 z* Z( k& C$ n0 C7 Q) Q( g$ t* H8 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 15:51 , Processed in 0.043530 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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