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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- O* g1 k- r" A+ P- t8 s* _
- b3 T( v: R9 h* ^# L; lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># r* H8 B  B' B! ~" Y
#include <unistd.h>
' }, K" h/ [6 o#include <sys/mman.h>
3 _& O3 y0 H( r9 S9 Z9 J/ Q#include <sys/types.h>
) j' Q. N& q; N( r( P% b) q+ ~/ l#include <fcntl.h>
( _2 e3 N  a4 ^# D  l8 E; @& Y& d* Y# ^. c6 V' Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " _. \* c1 a7 q2 `5 F1 I6 C9 L  C9 n
$ z6 A' f/ \4 w8 H
typedef struct  `, [- N  l8 o! [1 ^
{
; n/ Q9 x. v& k% y: l5 \  e- ?% e! }        unsigned int a;
3 w% h' B4 p4 o6 A' v8 D* K  K        unsigned int b;7 j2 b# M: T+ P" a+ {' {& F/ a
        unsigned int packet_cout;  J# W3 Q8 G( @6 n* q# G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ l* |/ J( X+ [( T9 f5 D7 o* s
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ M% q5 a# j) P$ ?' |
unsigned int count_copy = 0;+ z, l* p: N$ {; H6 H7 W+ H% Y+ ]
8 S. F' p2 @$ ?( |

  n1 O, X. e  K3 i; a. j) }% S$ B* v( zint main()+ l& U2 W- r9 H( d& ]  [, I; Z
{
# I' d- q, N2 u5 U        pRX_MSG_PROTOCOL pshreRAM = NULL;3 L" q1 J) A! o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 ?+ q5 J# _  j$ X" c* {; H- }
& e0 [' u. h& u3 G$ B4 ~9 l. {: r        while(1)* ?. X- i# p6 i4 ?1 W
        {) B* b1 P: m: Q  g5 |4 m
                read_MSG_buffer(pshreRAM);
' e+ O& Q. K2 T/ J; I        }               
& l( j5 g$ _, ?; A: d2 S}* [0 U8 @# W$ S$ m0 x. C. c7 s

  _: J4 l: Z! G% m2 {& _; k# L# Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 H% w+ L. Z0 Q# l1 N# W9 ~{
7 ]0 U& |$ m9 [        RX_MSG_PROTOCOL buf;
' G' `, U* O# {5 B+ c# c" `        # |" _6 r  E/ L
        buf.a = pshreRAM->a;
) B: H9 {& Y0 t6 [: P7 y  i( r        buf.b = pshreRAM->b;
; [5 I( u, S7 \        buf.packet_cout = pshreRAM->packet_cout;
' `: e: x$ v) w( Y$ w. X+ M  [' o! \        
7 C& ?4 O! {# u* r& ]        if(buf.packet_cout != count_copy)$ }8 ]$ i, w# L1 \) b+ e
        {; c( t3 u$ Z* h+ H
                printf("a is %d\n", buf.a);  ?* S( ]# U# b' q
                printf("b is %d\n", buf.b);
# S* z8 L0 c/ M                printf("count is %d\n", buf.packet_cout);
* ]0 ^2 p4 ?2 E- _$ [                count_copy = buf.packet_cout;" y" }4 \% C, |) a8 y/ J
        }/ |  I1 x1 `: r: S# a% r1 B
        else
$ S0 V( ^# ^; W' v3 z! E6 _4 [        {' r: S+ L9 ?2 q+ h/ Y8 i& i+ n7 H
                printf("No effective message!");
, H, s# s2 A2 p* [9 ^- m        }
, K5 s/ v5 t/ C/ r1 _}
) ~9 k+ ~& l* V! T; z& [, ~6 A4 v8 S: ?' g' H
! p: G* F. R6 a6 ?0 B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 @* S! Z6 h" `4 m# _+ a+ c
使用下面代码,对内存使用了mmap函数后:/ `, l8 b4 M6 p, r0 C; E
#include <stdio.h>/ V$ H1 _% r0 ~. [% R. r; X0 O. H
#include <unistd.h>- o! S* B7 `4 d% {+ V2 N
#include <sys/mman.h>' N9 U! d/ L7 m/ j- w
#include <sys/types.h>
# W4 D' I* ^0 j) v* j3 i0 [#include <fcntl.h>
. ~8 T$ o, L6 N5 x# s& q+ Z- i( X
1 }( R$ n2 g% C: n0 a3 P#define SHAER_RAM_BASE_ADDR    (0x80000000)
; v, l4 n8 s8 ]#define SHAER_RAM_SIZE         (0x20000)   + Y7 G8 P0 z7 ?) Y

' R2 a6 @0 A( qtypedef struct
, g* d% I( J# }! A9 @8 t# M( D0 K{
6 Q! j' M' Y! h: ^        unsigned int a;0 G8 Z9 M2 n, h7 b3 N; \1 [
        unsigned int b;
) E! f* I0 `9 ?" U% o5 C5 {; M. S$ u4 d% \' B        unsigned int packet_cout;6 z9 d) J7 z: c( U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; b, Z1 Y3 Z+ ?5 x+ c5 c# W- H) p: A- |. a: y$ b! H  ?% |3 n
void read_MSG_buffer(int *baseaddr);- R1 y0 j% ?$ S$ B) E1 y+ ?
unsigned int count_copy = 0;
' N6 O  Q; ^: |. D8 G/ R# @) }1 T: t
int main()
0 X' i. Z( @- ^3 S* b! J$ Q{
% s* {0 r& B$ H  Z- K$ a        int fd;
& v* ^& o8 j  F2 M) B# H% P, v        int *mem = NULL;, U6 Y# O4 Y2 p

4 e7 @! b- e/ ~% Q" J) n& j        if((fd = open("/dev/mem", O_RDWR)) <0)4 {, @3 D( V1 @0 b
        {# i5 ?9 N( }+ `/ D) j% P/ s
                perror("open error");
2 P' M# Q! H6 T2 T                return -1;) V% O( b# h! A; F8 e, ^: `. L  D
        }7 ~. a7 N2 [- d; s9 W! M' `
        
( o! J% A  Z/ G0 f% ^        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ B/ q" f7 U/ s* O
( M% A  i, |# o
        while(1)  Y; U+ u# s8 ~* v; D/ X. F- t  @+ G6 a
        {8 Y/ D( `7 y% k; a3 Q  K
                read_MSG_buffer(mem);
; r% l( t( j, J6 N' C        }               
: o: r4 y2 y0 w1 D}
; v! _/ n9 N+ c- f. Z% B; T8 l% p2 V; q7 [, f; T4 t- d
void read_MSG_buffer(int *baseaddr)
7 P! P3 }* c; d4 Z* Z( B{1 J: v. x, h( _+ C
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  F, X# u1 y7 E+ n/ ~+ Z5 z, \3 j+ ~* t4 H
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: T  O  ^4 f) o% q

+ `# \3 h: Z4 O" q( ?% q        if(pshreRAM->packet_cout != count_copy)' }+ g6 g6 g& M4 a9 k) v1 |3 f0 _' ~
        {
$ {$ v0 v% ]1 ^  a: L                printf("a is %d\n", pshreRAM->a);
& c5 O4 z! }: \                printf("b is %d\n", pshreRAM->b);
& F4 N" P4 X* B- X                printf("count is %d\n", pshreRAM->packet_cout);; ?, ?! B* M& J: `% T
                count_copy = pshreRAM->packet_cout;
# m: C9 B- Q1 F5 v7 K$ d        }
6 X" N# ]  n  W* e2 d        else$ O# ~# M- @+ B# y/ B+ r2 A
        {
! c& V8 S! d# l( j3 `, I  B                printf("No effective message!\n");' @5 q  Z( t. d& M4 s
        }5 d3 V% K2 f- m0 M# H0 w0 b
}
+ D* A1 f) g4 E6 A$ g+ l4 ^% M$ O$ U6 a; o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% y% {! R5 w- k# M9 i
2 a2 t' Y9 c$ Y* `* o- C8 w; Q/ W6 W+ _" `
9 D+ ^5 _( m/ R: U3 B3 ^- b

* h1 }  H: ?- t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-13 20:13 , Processed in 0.045580 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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