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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. [1 i3 X  Y0 u3 m! w: w1 Y( O% {8 s/ C- U2 L$ }
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 i; U2 P1 R$ J4 G# i#include <unistd.h>
$ C5 {" r% h. x/ c2 D6 U# c/ a- p#include <sys/mman.h>7 ]) O$ a. h5 x4 S2 W" \) W3 w
#include <sys/types.h>* k! h% O/ M' C/ H' M
#include <fcntl.h>
" y$ A) O4 x% W) s8 E
, k. f5 Q0 d% z% n7 c#define SHAER_RAM_BASE_ADDR    (0x80000000)   
  i5 y5 T9 t7 W. P/ O; G
+ W( u& f$ ?; R) `3 S& |typedef struct
; `. q1 f' K$ K) Y; k6 k' y{
% C/ m+ T6 Q" i- I/ |3 t, A        unsigned int a;, y3 }  ^; q: ~. S3 Q" _+ f: K
        unsigned int b;: X% Y# j2 U% Y) I' N
        unsigned int packet_cout;
5 x( s, H/ P. H  {- t$ ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 P& T( z/ e6 i, ]- a. l
0 Z0 W2 ^* W8 B3 X( uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# M9 F, m  ?! ~unsigned int count_copy = 0;
% _! S& _, ]2 J# t' ~: s- X1 C9 T% t! a& g8 Y5 Y. [

0 ~6 B, g1 ?/ R; e1 aint main()
" f: m9 j3 e: Q, w{% F2 Q! v, I- m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' \" g% O: C. Z2 v0 w7 [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- E% |  p6 m0 e6 G& t6 ]# `$ t2 |% C4 ^6 m/ J  j  k& j
        while(1)
7 H+ Z3 x8 ~9 h/ f3 X7 D2 p) U7 ^        {
" x5 C( ?8 g5 \6 N+ ]& R3 _                read_MSG_buffer(pshreRAM);) D4 U  ^& U% N
        }               
* |4 U' T5 }/ H: P5 f}
) c& K: ]( v: F* k- h* j5 z2 p: ?' [
0 w: ]0 N- U0 v/ E8 @! T$ vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 i' g! |- X0 f0 @" k{
; ]. ]9 l7 {  \0 q" `/ s# k        RX_MSG_PROTOCOL buf;
; L2 h( R) Y+ \- C' Z        + E. c, o5 I# g9 u; T. ]
        buf.a = pshreRAM->a;2 f# o" V. I1 |  d8 L) b
        buf.b = pshreRAM->b;
6 o8 U. D8 M3 D  S4 a- e        buf.packet_cout = pshreRAM->packet_cout;$ [6 P! v3 P+ \5 j5 f8 j( d( V
        & ]* e; b+ k6 F* s
        if(buf.packet_cout != count_copy), S8 ~" j+ A+ P& q) C9 u0 P
        {$ i, K7 v5 S3 ?$ V' ]) @& G
                printf("a is %d\n", buf.a);
1 D2 t! l! b: `1 v% y. Y/ v, o                printf("b is %d\n", buf.b);6 O3 Y% j; c; R: \3 r. q1 J* y
                printf("count is %d\n", buf.packet_cout);+ v* O& ]' h( P$ X4 r+ n
                count_copy = buf.packet_cout;
" g5 ~/ l% T3 X! ]        }
+ ?' ~8 @, r7 B  X, E6 G        else
3 e- D+ B2 n3 x+ V0 P+ A        {9 T: _( e! F5 G  M( w- i2 x$ f
                printf("No effective message!");/ |( O" P6 i3 F  r7 y5 E) x. v) ^
        }
0 k% l* o% s; @+ U" {. i7 M}
  _# D; G& K9 I  l
9 k; V0 e* V1 g2 o% A  C" M7 `8 F: k4 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, N9 }# t/ }! {( _  F/ D  m% |' N4 O
使用下面代码,对内存使用了mmap函数后:& a1 [8 D& g5 d2 I
#include <stdio.h>5 m5 P- d' ^+ G. t$ g
#include <unistd.h>
) x) d& Y) v" i3 i#include <sys/mman.h>
% ]* B! l" H" ~: q5 L, F#include <sys/types.h>
3 J8 r$ x& I3 o9 l9 r. U. W#include <fcntl.h>) {$ r! w2 s* S
* d! `$ [7 L) H  }$ w  y
#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ Z& Z' G* p9 V3 T$ S2 r#define SHAER_RAM_SIZE         (0x20000)   
) j9 {" H5 d* C+ n+ V  I
, g: i) v' H. j* s  Z# G; }. Gtypedef struct/ w+ n+ _8 u1 V6 S
{# K) p2 R7 {7 U4 L7 j( B
        unsigned int a;$ X! _, R  Q0 R. P: c8 X
        unsigned int b;
5 V- L$ \  d) y$ u- `+ x( m0 K        unsigned int packet_cout;
' h3 j5 j- x/ u7 b. Z0 |+ m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# J7 E9 S% m  x+ v
9 [. X5 H2 P6 U4 ivoid read_MSG_buffer(int *baseaddr);; j5 b  G& Y4 ^3 X' Q# F
unsigned int count_copy = 0;8 V) l" t3 v# L6 S4 ]
) K2 V3 ]/ n* P- {) O+ F( \
int main(), a% k: t; `5 e+ h" K4 g
{
4 J2 K' Q, m/ B2 T6 i7 a        int fd;
* Q% O5 y! U: ~        int *mem = NULL;
6 \9 [/ R# s/ ?+ X) n9 R+ ~; o" O/ A, O, w7 H+ [7 B$ `
        if((fd = open("/dev/mem", O_RDWR)) <0)
8 O: S2 ~- t) g" U$ g: R        {  I1 Q# D' H8 e8 o
                perror("open error");# t& ~; k3 E' x4 a
                return -1;
1 w8 J# H8 a+ H& w3 ^; U) [$ V        }4 L# v: Q0 B3 Y' X
        # n  v9 L- E7 y& K
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 _. P  S' k/ T( i* j+ v6 @: H6 u2 ^/ B3 L$ h) Z( j. z
        while(1)0 T; b2 f4 L+ m$ o) `% g
        {- ^$ Z: r9 F' j
                read_MSG_buffer(mem);, q, L8 O3 _/ |) {) t
        }               
3 v# X* F: D% [}
; b/ F  l7 c- |( d% `2 M5 M, @* _4 M# n, h- D
void read_MSG_buffer(int *baseaddr)
% K' B1 g: T- ~{, F, e$ i7 k( y2 E- B6 ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ D9 p. t$ l" _5 J2 z& J
* z0 K9 _0 X" l7 L2 p! Y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. ^2 O7 l$ n/ Y; c
7 w  q( ^3 z& r5 Y
        if(pshreRAM->packet_cout != count_copy)
$ r' |. o8 u- l: x% s0 V        {
* P# _' A% C' X                printf("a is %d\n", pshreRAM->a);% ]$ Z- ]! k( f9 ?( l* B, r) Q( D% g
                printf("b is %d\n", pshreRAM->b);# a% z( W& ?8 \" P/ p7 Y' J8 V
                printf("count is %d\n", pshreRAM->packet_cout);
: a$ G0 d- [0 `$ J) ?* q# V                count_copy = pshreRAM->packet_cout;
5 z& s  V) c2 H, ?5 w        }; G7 F' q  v5 p; w/ p3 c- f7 e
        else1 C5 l2 C) [3 p; G# G( q
        {
% o9 B7 D* [2 V+ H# _                printf("No effective message!\n");& h, _4 c+ L& `% A) X
        }
5 f8 ~2 ~# f+ }& M( I& |}7 X6 C2 ?( @0 H

& ^3 ~$ f' \5 y  J- E没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- o0 }: g7 p: {

/ m1 S' S! j9 y' Y& @1 w8 R8 ~) \$ o  e- S

- A% r7 g5 g; D: y( L
* B& C4 N+ I# e+ R7 N2 `5 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 01:01 , Processed in 0.050820 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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