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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 |( A/ ^' ]. g

  `9 R! f* T. s; FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 Q- c1 b$ ?. J) U8 M
#include <unistd.h>+ _* S) U5 j3 g3 i# \
#include <sys/mman.h>
0 Q) n2 o7 E: m5 [#include <sys/types.h>8 o: }7 \8 c7 ~/ g7 }
#include <fcntl.h>% @+ S; A8 `! W$ t% G0 _% ^
) s7 x/ r9 r, e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 _5 u6 z4 N$ a( [( k' k
) m; R) a* ~7 _) }& o1 Btypedef struct
; z3 j# |' c: j" i  q* V$ D{
+ z# i  y  \( a5 B7 |) i        unsigned int a;
7 {2 W3 t# l* x8 G" W+ `$ W        unsigned int b;
! W/ _' f2 _* ^1 d9 V5 m9 u6 g        unsigned int packet_cout;; ~  H7 h3 c* R1 J. u' r% t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( \# `/ ^+ o/ v
, _, G1 E% M0 b+ I6 G' q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* Q, k& Z! L& P$ W* g6 i( X) B, D
unsigned int count_copy = 0;2 o7 w; e# k% U0 ?" x1 H
( Y% `2 k, @5 \
5 |6 N# m! ^- X  q
int main()$ C6 ]( H$ I- L" l1 |( d
{5 W" L' i* F+ s
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ J! d. G' D' f: n0 O/ q        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  m8 X) u- j/ W& Z+ v5 c3 n
, q  B+ F1 r; `. f
        while(1), ?# r& Y, s! D6 r
        {1 t  K* I  z* R7 S5 S& ~
                read_MSG_buffer(pshreRAM);0 R& j8 A# ~7 R* d1 l' Q
        }                8 z. P$ Y. a" `4 f* p
}/ A2 O0 S& c) }# A+ L

. m' P* @( A9 D6 P+ yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, p) f; p& l" N: p$ f' k{& J) g+ d+ q" H
        RX_MSG_PROTOCOL buf;
; Z, g8 v, S% y3 K/ y7 w; v6 R        # f6 T1 L$ f: @( @
        buf.a = pshreRAM->a;* D1 j! A) H& d! a. c
        buf.b = pshreRAM->b;8 l/ K$ n, X6 r& t
        buf.packet_cout = pshreRAM->packet_cout;# D' z6 s! B1 X' A+ w+ a$ j5 J
        5 l9 s+ @( s# p( ^, \
        if(buf.packet_cout != count_copy). x4 i) l$ J% n
        {
( J# Y( r3 \2 \6 [" c  s                printf("a is %d\n", buf.a);
% p7 M+ q# F, u                printf("b is %d\n", buf.b);& X) ~$ }6 m. W% P* @: ]
                printf("count is %d\n", buf.packet_cout);3 R- A" `8 p+ }5 Y
                count_copy = buf.packet_cout;5 V1 ?, o' e3 e( u* c3 e  n
        }
5 L- J" X* c6 D        else
4 f9 Y; f% q3 N7 H        {
8 |9 [- s# o6 r# u# s- y                printf("No effective message!");
. G  O+ K! t. ^        }
; \( R/ e  v! r+ f0 f# B}0 t( {7 l$ O" z/ P3 h, J: X9 b: Q

' L1 b  S- g& S+ C, @/ S$ ?- h2 W, j  Y1 `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! a% C+ G9 t8 |1 j# m  n& e使用下面代码,对内存使用了mmap函数后:
7 ^% b# h7 t' q9 {/ {" L+ t' U#include <stdio.h>
) S6 u# ]. L1 s- H8 M#include <unistd.h>& k9 r2 }  @# J4 E" F
#include <sys/mman.h>2 r5 f( Z, s- l3 K/ V
#include <sys/types.h>8 D$ W9 c& s4 }: @' N& w# Y
#include <fcntl.h>
4 ~  h9 O# {% X  H9 Q4 ?+ I* W* C$ m! N  x  v
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 q8 T8 \6 z4 q. @2 B
#define SHAER_RAM_SIZE         (0x20000)   
- p; x0 l0 t/ d' |2 U2 U
: ?' V7 _2 z5 `4 D5 O) s. [$ Etypedef struct! ]$ x" M; l& C* R* U+ n$ ~* P
{
5 [* J$ F2 W1 x        unsigned int a;$ h+ B! y4 k- b$ C. `  }
        unsigned int b;
" ^2 y: }/ Z1 J1 @9 h6 s, |7 S        unsigned int packet_cout;
6 d  L% j4 x' d7 N}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ W) k- m  K" O2 ]2 V
) C3 K+ [/ V. ]5 c. h; a6 _$ Bvoid read_MSG_buffer(int *baseaddr);
: w+ l3 W$ b8 U3 h0 vunsigned int count_copy = 0;; i3 n& G1 n* ]$ ], r

0 y) N6 @) C9 ?; z. _2 fint main()  y& {# U. T$ B) p! F/ j4 W9 g# |3 |
{
  E: Y. B7 ~' z& H+ U" z        int fd;; d* y9 [# q% Y% H! m$ b
        int *mem = NULL;
7 Z3 s% s/ v& n$ k
5 Z+ t0 w( }4 X* X        if((fd = open("/dev/mem", O_RDWR)) <0)% w5 v5 d9 L! h
        {' n( o3 h& {& \5 W' O* `" Z
                perror("open error");7 |1 x# m6 Q) ]! ^2 ?: ^+ R! a1 R
                return -1;8 W0 ^% E) C/ V/ v/ Y' [& l
        }
" ~. u9 I8 i+ `) p& Q        % c2 }/ Z5 }7 w% l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 X7 P% f5 G1 Q: d
4 F) v# n! F" M( I, Z5 N4 `
        while(1). W! ^3 L' v6 O6 O2 J
        {4 ?2 `. H" V1 u) s) j
                read_MSG_buffer(mem);4 t% a+ v. M/ B
        }               
- N0 F% D6 N2 ^# s/ i. Z! R) ]. i}
! ?7 ?  T$ R3 z) @& I; A- A( ^: V- k* _: p8 R# b9 N
void read_MSG_buffer(int *baseaddr)( d9 G* ^' p9 v' l1 E  u
{! [$ v9 {1 i. J: i( a
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  T. c& Y0 n0 Q/ k  b* N( `
$ q" f, O7 _' \  f! N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
, X5 o5 q# F7 _
! {  I. `& M9 J  f3 |        if(pshreRAM->packet_cout != count_copy)6 ]' J" P1 Z! E/ |
        {
# z8 ]& L3 `. Q! i                printf("a is %d\n", pshreRAM->a);. k2 ?3 L1 l3 h& f/ c
                printf("b is %d\n", pshreRAM->b);: F# ^3 C! d$ U. P5 R
                printf("count is %d\n", pshreRAM->packet_cout);
* A/ G( a4 F0 Z( c0 \                count_copy = pshreRAM->packet_cout;* X& u' A8 s4 u1 x# _1 z
        }
; c. t( Q+ J/ L2 n  O5 n- P- Q: G        else2 Z4 u( p( p/ P! ^2 F- w
        {+ i) X, t# L+ ?5 ^" j
                printf("No effective message!\n");
0 c6 Y. l' P2 [) v+ l) {. s        }$ z( ^7 B+ W! N# `6 w* {) L
}) |7 k6 `) U6 I5 }- {- B

: a" x' S% u$ o7 g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 k' N2 {+ A  }

7 x( R# k9 }- o' `
; V3 m6 T7 z% @0 i2 M$ i6 Q+ b
0 E2 _3 M# ]/ A3 I/ d& f1 |: ^: S3 j, A. a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 07:03 , Processed in 0.046906 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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