OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ I$ X8 G$ B' A( R0 Q
# N4 y6 |+ R0 V) OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 d: u" C* G2 @7 P0 ~9 N" j- r
#include <unistd.h>
" i0 P6 \9 o1 }* `#include <sys/mman.h>9 v% y% z5 Q. b) T' g
#include <sys/types.h>1 x0 {! C; f- Z' r# `
#include <fcntl.h>: n2 H1 M0 r  ^' a
6 j3 L9 }7 M9 a: C/ @( I% l
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) M' Q" Y8 ]5 K, l7 N6 ]$ C8 E. ^$ c7 C9 @# N) ?3 h
typedef struct
" `* M8 F2 Z5 {) s6 G% A{6 q$ j- G* j4 C3 L( m4 s. E" D
        unsigned int a;
6 K2 k" O! Q' x, o& i2 V6 K) u% j        unsigned int b;
+ L; c' \0 ~0 b0 z6 \' r        unsigned int packet_cout;
$ G2 d1 y  m" y* r. C6 |6 Y8 }; P8 E}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 |. z% T: ?' H2 ~4 r! D7 t3 v2 k" F9 H; e9 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 D, a9 ]/ C) c+ D# Y4 Zunsigned int count_copy = 0;
. M- a0 @4 n; N
2 E" G, ^: D7 f9 M/ B' U: V
# K* w' p6 p8 h: [' sint main()
8 D6 c6 d# U& F% s{) Y* l9 J# z) e8 U& f* ^1 z$ x
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ B7 o' q& I  T7 R3 |. G" o& p
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
% J4 f* G' M6 k0 x) y
5 j, L$ m' p' l. b        while(1)
) T. p3 L8 q, w6 l' [        {7 ?( ]+ z" O5 E+ @* [' O  R, o
                read_MSG_buffer(pshreRAM);
. w2 N/ V0 B5 {) r        }                2 R* A: j- _* G5 r& B: G: \& G
}5 Z( Z* @1 W, Q5 ^7 ~# @3 g
  G; y, d5 w7 V" y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! k: M* ]! s$ C" u9 Y{
" g: n: T( ?. Y  o- p7 s& z- E# `        RX_MSG_PROTOCOL buf;! k. o8 k) B! h; e/ ^
        ) G* V1 W( Z* s5 r- c. R  P1 [
        buf.a = pshreRAM->a;
) G4 n: Q" s" S        buf.b = pshreRAM->b;
; e, P0 F& C- j6 h/ |        buf.packet_cout = pshreRAM->packet_cout;
2 @9 n$ p- p/ A        
! r3 p7 h6 P& h# c1 I        if(buf.packet_cout != count_copy)% w- |  E8 R" H) s
        {
& u8 S0 F, q# z8 f( v                printf("a is %d\n", buf.a);
2 Q+ P) U( i- i, K                printf("b is %d\n", buf.b);
& z& z6 H2 U6 u) q0 r                printf("count is %d\n", buf.packet_cout);* ?. o2 i# m. w7 \( ~2 ]  `
                count_copy = buf.packet_cout;
, _3 A+ k- T1 B! m0 x" e4 f        }
# Q- n$ Z- x" [        else
7 i' j; j7 T) J6 k& F5 d        {
* R1 P/ E$ s, d4 E1 n5 h/ s. y  K                printf("No effective message!");; D. [2 n# y& s$ q- q7 d9 V- c
        }
6 b$ ]6 q3 g8 u! ~}
& R  p2 \# C5 G" V8 I+ u/ A+ j8 Z
4 m+ R3 W6 O; H2 \/ p' q1 s1 l8 u  ?& y# M7 M4 M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% ~* \" X' q- T1 r% f
使用下面代码,对内存使用了mmap函数后:$ v6 J. d" Z: I. H* o$ b: k. u8 [
#include <stdio.h>
7 F/ c% H/ I( g. q#include <unistd.h>
; b* {+ y# |. \  s1 c0 R4 l#include <sys/mman.h>
7 ~5 c* e% C* {5 I#include <sys/types.h>/ R4 w* R: {) V' Y2 h4 O
#include <fcntl.h>- G  V5 w8 F0 y1 [

& E8 k+ c/ o3 M' ]0 ^# |#define SHAER_RAM_BASE_ADDR    (0x80000000)
: g2 X# W1 A$ }4 a+ g#define SHAER_RAM_SIZE         (0x20000)   
% m! C5 P3 J+ ]0 ^
* F- ~8 M4 E5 P/ f) I0 Htypedef struct# t/ z4 d1 O, `
{
  j8 G  s) y* Q+ I/ c        unsigned int a;  t& s$ n+ k( I6 M& P4 V
        unsigned int b;
# |+ x7 T- E/ m/ J& B        unsigned int packet_cout;% w0 \  ?. l* i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; b7 g5 g# L8 @

2 M  s1 \- Y- D* J- Evoid read_MSG_buffer(int *baseaddr);
. \& P7 O4 ]: J  S, Hunsigned int count_copy = 0;, M6 {% u+ h/ I

  C# g5 G0 |# g  jint main()
, a, K6 T6 y2 f0 f9 }0 J{
# o' U' F* s2 B3 V" ]! Q3 @        int fd;
& p7 C8 k! W+ ?! D        int *mem = NULL;
* O# q" r3 V/ O! ]- |7 Y. O0 N: m2 H! Y" ]
        if((fd = open("/dev/mem", O_RDWR)) <0)3 n9 @' ^# c: G$ K) l6 b& C5 d
        {/ Y! k: _. l% V6 t; Y: {3 D
                perror("open error");
  y& T1 G, ?4 x; J                return -1;
  w& a! R2 V* Z! q# m% |8 ~        }
( A0 e( r( y. e0 {5 G4 T" ?        
# L% e8 W8 K0 q* I( W4 Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 q' b, `8 N2 f& w+ g/ [  k. }: I  F0 H, W0 Y0 }! p3 }
        while(1)
6 ?4 K: l6 u! a, l" c/ [) z        {  Y- B2 j2 m) h7 G8 d
                read_MSG_buffer(mem);
6 Z  x5 ?! G$ [        }               
5 w- O# _* r6 C# p3 {}- x+ G7 X$ h0 M. |' X
+ k2 c6 C4 H+ E4 O# v+ Y
void read_MSG_buffer(int *baseaddr)
7 i3 P2 c7 }8 [2 [) P{# i; ?1 X5 C% v- h
        pRX_MSG_PROTOCOL pshreRAM = NULL;' Y; g) b0 w2 A( `

3 W& R" D4 l, a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# J+ E4 e' I# A# w
) ?6 v3 g0 W% _  g. K8 A; @* o* t
        if(pshreRAM->packet_cout != count_copy)* n- W9 C- W3 M
        {7 S$ `1 h4 C; K9 z6 B
                printf("a is %d\n", pshreRAM->a);4 C' Y/ Y1 _+ u7 L" _
                printf("b is %d\n", pshreRAM->b);: _1 U8 c! R% @* r2 g
                printf("count is %d\n", pshreRAM->packet_cout);
: _  B$ @! w* R9 j/ J1 s                count_copy = pshreRAM->packet_cout;
  X$ p7 t- A: o        }' [8 r! H' @% E6 ^
        else
+ f8 e: q, r( o4 A) L2 w7 c2 `9 s        {1 x8 n9 s! N- p
                printf("No effective message!\n");
3 f% L4 H, V; T+ }1 t( r( ^0 c        }, j2 `- S% w/ M
}
. t# h) K. H1 w% m/ W: q/ c" @3 {7 `+ `( B$ E! l  x% T
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 l* {6 L. U- y& V  o! _

( x* c6 A0 o9 T$ v% H8 O. r0 K
  F# N0 {0 H! i1 `% X4 h3 I! z" j2 ^/ o7 N. o" |
6 L  ]  C& I' a8 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-25 17:08 , Processed in 0.038344 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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