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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 w: X$ u; Y3 [+ T$ z+ ?- s
' U$ S* l  w  Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: Z  ^  Q, t7 K' P, u& L3 J
#include <unistd.h>6 a) c* P8 E7 V/ I& f
#include <sys/mman.h>2 I+ h* d5 N9 B) u# F, N0 |) S4 g4 f
#include <sys/types.h>: \: G3 ~7 X4 I1 \& h1 B4 \2 c; D4 F
#include <fcntl.h>
6 [6 ?+ w8 [8 G: Y2 k
! r$ p& `; W8 {+ I6 Q#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 U5 i( V- H# M5 m4 f) A3 g" v
' D* ]) o8 Y, L) n9 k* B0 u$ s" o" }% Utypedef struct) k- T% ?  w, A& `
{
( x0 X  `2 U6 T8 M0 ^" H        unsigned int a;( q) W3 a! R: {* j; g8 C" f
        unsigned int b;
" F5 y9 N% W- p. R, X        unsigned int packet_cout;& v, N$ D5 G& p. }/ E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 f9 B9 ~" u4 v; D$ |, k  w% y! ~- d! m' e2 A. }- M$ t
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 ^/ P# I: }- N7 L& A0 v" K& gunsigned int count_copy = 0;
* R2 X; O/ W8 w+ S
' x! y- [, J) e7 O( q
9 }0 l  |% }7 ]' a) H; H/ [1 Jint main()/ H' Q1 c& N6 v" ^
{
, y+ j8 b& _# Z& N% x        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 e& ^& @' O' I7 T! y6 o" T! B3 W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! a3 ~) R" L) C# m7 |- ^2 \" l; Z, p( }
        while(1)6 e% z0 A; u) j  W1 i
        {
" t: f" k) U  ?; P$ O$ n$ L                read_MSG_buffer(pshreRAM);! h$ N2 F5 c5 b; Y. h2 ]
        }                . w( Q, A5 I" w0 R* D
}$ e! f5 D: B, }4 ?8 D

! [3 q( i3 q; p' r1 \' @* A0 rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" I" V+ ~  J8 K
{4 R1 e; ?' u. g& H1 @& r( d
        RX_MSG_PROTOCOL buf;
- |: D/ W( y% n. j6 ]        
6 y! f# I# h- _4 K% ~2 I        buf.a = pshreRAM->a;- w* a3 ~+ C9 q
        buf.b = pshreRAM->b;
/ _% v# n- }2 |5 c. c% A        buf.packet_cout = pshreRAM->packet_cout;( G/ G% `' |7 {- Z8 N' O& Q
        % T/ s! U' D3 S: d- r% e
        if(buf.packet_cout != count_copy)
! t* U0 r6 a6 G, B# {/ v0 T        {
4 e/ A" C. [5 x" F$ A4 u                printf("a is %d\n", buf.a);9 t6 T* b, |: R' O' n4 ?# W
                printf("b is %d\n", buf.b);( P( D8 _  H  W5 Y( k' I0 J
                printf("count is %d\n", buf.packet_cout);
; e/ O" }: k0 Y8 q0 i/ l                count_copy = buf.packet_cout;
6 n: r  `4 [+ o* Z        }* @* O  y. q+ a2 |: |
        else
* t6 |9 _8 f# H6 g4 w4 b, _        {
& [) Z9 j% O% i. U2 c                printf("No effective message!");
* r( \$ r) ^3 ^( W6 e0 C$ k        }$ B; k( c, Q( q
}
+ c( e: ^, S3 |% G" g5 e% S& P
. k# j4 Y8 n0 C9 s! o7 V$ Q
& ?/ T# @5 H! ^: ?' a! F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% t; t) W# B7 k* J; Z) U使用下面代码,对内存使用了mmap函数后:
( h/ q& C; R( g% t#include <stdio.h>
& n8 k) g5 D) c# t$ W& L- @#include <unistd.h>
. V" s1 Y0 g* L( R; w. K+ E#include <sys/mman.h>0 [& h& A- L% h0 I, J
#include <sys/types.h>
" g! u0 A2 ^- X: L$ g& W  L#include <fcntl.h>5 W! v9 y+ J$ h2 o
8 ^1 i- z; u/ q; m3 k" F+ r- L' `
#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 @( p6 Q+ v4 `7 y$ r8 x; {# x#define SHAER_RAM_SIZE         (0x20000)   
  _$ }# h2 T1 u; K, G  o$ D2 b
+ `8 p' c! [! k+ Atypedef struct
% N3 c4 Q0 t& ~! h{
) i  a1 b3 q! L8 [& p5 `+ u" m        unsigned int a;; E, z6 ^9 t5 C' B+ W3 @" c8 G
        unsigned int b;
) ^0 w" `5 _* {) K6 R        unsigned int packet_cout;0 n$ b3 o) b& f% G- G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 E3 |: v7 T' b* X8 b/ s- [, R* n
4 y. {! a4 F9 Y: V/ `/ F0 o2 xvoid read_MSG_buffer(int *baseaddr);
& n7 I" N- A, A9 R/ g, _( vunsigned int count_copy = 0;' H$ y+ n4 ?( V( g4 }# t

- [3 o' f) x: i) gint main()
) f- t) A/ [; }, O* z{
3 ^3 X/ S  ]5 p2 E/ ?        int fd;
( i" D! Z9 |; I  U' r$ l, u& B        int *mem = NULL;& ?( O& ^. f% u

6 [7 q/ K$ `7 v; {" U        if((fd = open("/dev/mem", O_RDWR)) <0)
3 y& l  {, l- G/ S        {* D5 Q1 A# k% W* N9 Z4 f6 k. {; r
                perror("open error");
$ a/ R- O( S3 h) ?& ?# T                return -1;; |$ l0 ^8 |* ]- D# ^
        }
; n  j2 i$ n; c$ J        : \# b5 Z/ Q' J* `( N1 Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
% ?8 I# V: a5 K/ m. G0 B
: G# `4 R2 g: Q* l+ e7 ~8 G+ J+ Z' d        while(1)
  Y: v+ j4 K6 ~" @0 t        {+ T2 O% @% b5 C) n
                read_MSG_buffer(mem);
& D6 Y- \5 h: |% ^  ]        }               
5 p, b" d" I% m}
1 C5 f" X2 z* }* T9 x* D
$ u; q" L- `" I. E1 Yvoid read_MSG_buffer(int *baseaddr)
# g$ C$ g) ~, @7 h0 Q) m4 |{
$ ]" v0 `5 P& H/ g3 F& N+ O        pRX_MSG_PROTOCOL pshreRAM = NULL;+ O, h. f/ B+ c! S( l5 I1 w7 C) Z7 O( D

" {: c) R9 B0 c2 z* f: x! q- |& Z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;$ Z* u. B) ^- k: t
( G9 Z/ U5 |! ?6 _0 \2 _
        if(pshreRAM->packet_cout != count_copy)% i( y, A! @* r( ^3 q4 V2 i
        {
- V" C# e0 w* ^, x$ N: g                printf("a is %d\n", pshreRAM->a);
; i/ p  c+ w0 m5 Y                printf("b is %d\n", pshreRAM->b);8 l' m8 z8 F' O9 F& a" o9 C: t
                printf("count is %d\n", pshreRAM->packet_cout);  ^) [8 e2 z% ^- V, c0 d3 |6 @) L
                count_copy = pshreRAM->packet_cout;3 \: L" O& c% z! o$ V( U7 y
        }" Q$ z9 a. O' ^6 G- ?1 \
        else( y# L4 I1 q2 P2 H% z) w* N- \
        {0 W. I1 Z9 O, ?* @. \
                printf("No effective message!\n");. A7 P% g4 e5 i2 J. ^
        }" [0 }' Q# \/ m0 F( D% z
}
4 g, k. T1 D! Q* p4 f9 Y- ]. L$ H4 P. ?0 ~. Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  g4 i( C/ I- J" L( N5 ^+ y; K0 \

( n. x4 V3 v: |1 V* J& `
  K8 O6 t7 v; b: P% E
% d! E8 p$ t& X3 Y$ i
' F8 Y1 d4 ~* P6 y+ h1 }; h  B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-12 16:43 , Processed in 0.042086 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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