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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! p) d% n5 F+ ^; E/ `$ x% S+ e8 u9 S) n- n0 I, B2 t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 ?; s! Y: m! c, Q- X$ N7 E#include <unistd.h>; k. @4 q- j/ d0 u1 |6 X- z4 i
#include <sys/mman.h>  A2 E' O* G6 v* l4 j+ Z
#include <sys/types.h>
. Z. x8 I4 ~( j3 j. s#include <fcntl.h>
4 W8 b, X/ b( U; e7 u& y& J1 _* Y
. e7 Y+ M, x. i' X% S, q#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 {& C: K& L* U
5 B% }4 Z4 N' k1 |+ }" ctypedef struct
- i9 ~/ g/ m) z4 N{7 c1 a& m/ P2 ^" ~1 @% y
        unsigned int a;0 u3 m+ `, _! |% x9 P$ P) j) x3 M
        unsigned int b;
' O9 E' e& k) F& D# K* x        unsigned int packet_cout;; l9 w. E$ l2 N0 p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 a7 t4 G$ y- n  w( _

2 D! _! Y0 k3 i0 K# Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);3 q8 x8 I. t& d  Y1 a2 T$ Y9 h- K9 @
unsigned int count_copy = 0;3 P2 p/ D" h2 u; Z! u
* e, h& R+ d- X! I) ~2 \) ]$ k
  G# r" d! @, x  A/ X: T$ A' l
int main()* z/ P/ {$ O3 ?/ n4 K% ^9 F
{
  A. g4 |; G# S- B) ~        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 g3 C6 O9 M, a7 R; m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ L" C. B3 F1 X5 Z  x1 c' I0 k' G  r- g
        while(1)
, @' V1 b# e' t0 u7 o" V) W0 `        {
7 o8 q& I3 G+ u; T" c9 g" K9 N                read_MSG_buffer(pshreRAM);
0 y+ |) c% A1 c: \" k! j        }               
* ^6 L/ y3 L* ~; [, q; T' a' \}2 o5 y( ^  t, |4 ?& J3 E
$ G; e  F. B) u* z5 [, K1 m5 R
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; c! n: e$ A* @5 [" K+ S! B5 F9 l: r. k{- ?  u; @% m; ]4 T1 @+ M
        RX_MSG_PROTOCOL buf;( Y1 F4 V5 s) Q' b4 Y
        % _2 [. c  c  c7 S& B; O5 x0 j: \
        buf.a = pshreRAM->a;" d: _0 |! @4 K: W
        buf.b = pshreRAM->b;
5 _* Y0 m& i+ N/ {' }% m1 {        buf.packet_cout = pshreRAM->packet_cout;
9 n' t- B$ W) ]/ p$ t        
) a4 S  W8 K0 [        if(buf.packet_cout != count_copy)! h7 w# l9 H" ?3 z- Z
        {1 w$ U, n- u: u& a
                printf("a is %d\n", buf.a);: @# l' Y8 f& v  n* d$ D& `
                printf("b is %d\n", buf.b);" Y$ L' R2 I; @+ }: ^+ b/ y2 `" X
                printf("count is %d\n", buf.packet_cout);
9 x& C2 k# u7 q& F9 |9 h                count_copy = buf.packet_cout;9 t- ^6 `, E' g8 t+ }4 p- [
        }
0 b$ l+ _- W) d7 C# u* x        else9 R/ A1 ?9 g/ X2 G  c6 Z' q4 ~
        {+ Q4 l; Q, x' V1 {6 A! ^& @
                printf("No effective message!");2 X- \- b: U& {$ }. q; `
        }) ~: |+ l2 O( H; Q2 U2 B
}
7 `# g" f' [. K+ c" r& ]/ ]0 N/ I* G0 P

7 C0 [6 E, X6 F" B. X( I4 _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. X  p  |& d' L9 ?+ H. _0 Z
使用下面代码,对内存使用了mmap函数后:
* ^* X. x; D  ~0 O7 F  a% _3 R#include <stdio.h>
& `. L/ h) h$ D; Z( Y#include <unistd.h>
/ H! c4 M4 @' ^! Q) D' c#include <sys/mman.h>
/ [( g8 V3 a: ~, o5 q  h+ K* ^+ [#include <sys/types.h>
5 p7 [" p3 w% Y& j! ]3 v: [#include <fcntl.h>
7 Y6 ]9 G7 X7 W* m: n, f( K2 d6 \- H
! _% r8 \" |9 V4 A3 |7 P& v#define SHAER_RAM_BASE_ADDR    (0x80000000)
  B3 e% c+ K9 v" @#define SHAER_RAM_SIZE         (0x20000)   
3 r+ I: s2 D4 u+ n
7 A5 d6 ]' B0 |+ I; A- N/ htypedef struct( W; f( x; Z% f# @9 ~1 a/ T
{
3 H/ n" Q# q2 i        unsigned int a;
3 p1 C) j9 k2 d& |+ T        unsigned int b;2 q- V; @! q+ G' B
        unsigned int packet_cout;  Z$ y- t* a' z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 r) ]0 k" O$ q- G8 e( l8 ^( h0 z$ h( r
void read_MSG_buffer(int *baseaddr);# n  O5 h7 }1 G7 X
unsigned int count_copy = 0;
6 A5 X( A: b9 m7 `8 C, ^8 c' w2 ?. S( d; d5 ~# |
int main()
6 L2 Q1 ^) s- W4 ]+ {$ Y: i{8 x8 m! g4 u% f% d- N* v/ A( g  F
        int fd;
/ y: |9 o& y6 M: Y3 e  i        int *mem = NULL;
' j& Z' ^, G, z% {, n+ S5 N
; p9 n$ _" k! n1 M- |( L- y3 Q3 i+ b        if((fd = open("/dev/mem", O_RDWR)) <0)
9 z# v& b1 h+ Q0 g. s$ |# V        {: O1 ?' [3 d9 ~' R
                perror("open error");* h0 P3 ^0 {' O% u% k  j/ w
                return -1;
. Q& x+ j3 E0 c8 \$ d  k        }
& A; X0 E  g9 d# g" S        
' f& I9 S# R: g2 Y& [        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 p- J4 M, Q* J% L5 ~# X, \" B! H7 I+ \3 _. I7 B# j3 U
        while(1)
( V5 B% F6 D4 G6 z        {  v7 C  e4 j& Y1 E+ B* i" x
                read_MSG_buffer(mem);
7 E  u: p( A" e0 i2 c: F9 _        }                ; W' k1 ^9 `' }5 J* d
}0 j# x6 I6 h3 C" B
; z" ^# N' ^) H3 j9 A& K7 i1 r
void read_MSG_buffer(int *baseaddr)9 L' x3 @. Q3 L7 B# F3 h) S
{/ h, X. e  s9 ?; s) d
        pRX_MSG_PROTOCOL pshreRAM = NULL;, k% c2 T6 M: l% ?& }! m, j0 R

) N" }4 q. O2 N2 i) U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" E% C* a4 _" P2 ]' m7 s$ U
) r. d, H8 W1 C0 \5 m5 J        if(pshreRAM->packet_cout != count_copy)! j" J, ?. H! U/ j
        {$ g' P# p& V" f! K' P1 N
                printf("a is %d\n", pshreRAM->a);" q+ H, b) e" Z3 B5 M
                printf("b is %d\n", pshreRAM->b);5 N9 n$ ?2 y4 A. N! t, d, J) @& g! c
                printf("count is %d\n", pshreRAM->packet_cout);1 g1 l0 ?( e$ B0 g
                count_copy = pshreRAM->packet_cout;
& ]+ u% k& }/ t        }# {4 h4 \+ a/ A
        else
' H7 Z! w* D) k- }/ R' l        {
$ Q  m3 N+ Y% q5 l* }                printf("No effective message!\n");
  S- K# j5 f8 n) m" h) `        }
% Y8 @& ], H  {0 c}
- u5 P  ]8 F/ x. d1 P! M3 e
8 S$ A: c, `1 i! v$ U! u. m没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 [' H, ~4 E  [+ \
: @; s: m/ g. P: t$ S8 |" A4 J9 r# A! J- p9 T, t: ?4 Q3 @

5 a) w: E, x) r5 V& X. D# K# p0 ^* P! c0 Y; L  s6 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 23:46 , Processed in 0.045724 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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