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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: u4 a2 z6 \2 g: M9 m9 J0 ?2 k
2 W! s8 P0 C: L: T2 i) uOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: D- I7 X* O, _" d" w#include <unistd.h>
. x! n% U, s1 t& a- D$ c0 N#include <sys/mman.h>6 k) C' T' b" n7 \) L+ l
#include <sys/types.h>% F% ~) C; Q1 J8 [' m
#include <fcntl.h>
; d$ P, U0 h" O
3 l' Y6 m4 U( D5 H7 g#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ V0 w; Y$ M/ `+ i: B) e
9 H; I  a( d8 Q' ?typedef struct
0 q9 ?' x8 |* o& m/ r+ V+ E! n8 d6 [, t1 j{$ j0 P1 _7 S# T$ y4 F5 U( _& m
        unsigned int a;
/ D, P1 C& j( t! y        unsigned int b;5 a4 v5 |0 b+ M( z( G8 b+ `
        unsigned int packet_cout;
3 ^8 X* s6 y& Z/ U! V3 _+ z% K! h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) G: _5 c* w0 i2 n5 |

- J) \! B0 Q& B! Q7 o# Uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ d  m" ?4 o3 ?4 L5 S" o! A& I3 s
unsigned int count_copy = 0;3 j- l$ f+ J: `
4 o: h7 G( I  y9 p5 _* ]

" S; x9 C7 z: I! q6 b" k* qint main()
' N/ t$ \. w- X9 _) B{
0 U( `2 o4 Q, [# n  `+ I        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 M2 S. b; ]* [+ Q$ ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 d: v: I1 x4 [9 ^6 K% o* W4 t- v, n4 N- G6 Z$ u7 n8 p
        while(1)
( ?. I0 a, i- t/ M; G2 ]        {
6 t0 |3 r5 n9 E7 `                read_MSG_buffer(pshreRAM);9 I- e1 [4 d; n; Z4 `  p  n: t
        }                7 J! W" o+ {3 w  E# {: Y
}
3 ~2 t+ f# z  q. d2 B2 G' Q% v* z, d6 l+ ^: o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 e( q$ E- H' k( i8 g6 t{
6 O( {" e7 p6 h6 |! Z# n        RX_MSG_PROTOCOL buf;
' {/ `. p0 q1 T% C& _        
# }  k9 w( f* n! w+ |0 |. E! Z        buf.a = pshreRAM->a;
1 l0 M: |7 D/ Q: @# O' i        buf.b = pshreRAM->b;  e( u- c" T% Y3 ?/ a" Q: K
        buf.packet_cout = pshreRAM->packet_cout;
8 {% `) b8 ~( h: v; j        ; N. n: N# _0 p* n
        if(buf.packet_cout != count_copy)
) Y! ?% I. S; Z- ?        {, S/ X$ k" W8 F3 [
                printf("a is %d\n", buf.a);
, R% X; {! B3 `( h/ x1 a( S2 A                printf("b is %d\n", buf.b);- [2 E$ p; T6 Y# D* f/ d
                printf("count is %d\n", buf.packet_cout);
+ Y" D* j* d" T9 r" g                count_copy = buf.packet_cout;
. x, v* c! ]- |        }
# Z% u/ {9 f+ ^2 X3 ~        else
/ |# y9 k& k) B" v        {3 a2 o3 C) N' u5 o) F4 l
                printf("No effective message!");4 s5 P3 t2 D4 x: g/ d6 u9 M/ }& ?
        }
& z6 n3 u% n1 S1 X}
3 z7 c. l  \$ q; F( H9 o
, i7 E7 J& |3 p4 C/ x8 E
, a: s, ?. A0 G7 ~+ z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 Q7 A& e+ o, l+ ^" y+ P
使用下面代码,对内存使用了mmap函数后:6 Q8 g8 x. t; w" q" I8 `  Y; u. I3 v5 z
#include <stdio.h>. Y8 B, {- J9 G7 b3 d9 P+ Y
#include <unistd.h>5 k4 m: k; V7 Q: h
#include <sys/mman.h>) I# b. d! y7 n5 O& k9 J4 S! M4 [
#include <sys/types.h>
& c4 C8 B+ d* d1 S+ T#include <fcntl.h>
1 j7 B8 F8 W3 t  ~* ]- z3 P
' N  l7 ?2 P2 W  K% J& f#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ x4 x+ D5 j: a8 t1 e. r#define SHAER_RAM_SIZE         (0x20000)   8 E6 t8 ?* t0 U: g+ |3 R1 R$ D7 g

* V& J% N6 J, h8 E. @typedef struct- i! R6 [5 S. {- {8 T( u
{6 A# K$ A$ ~: G, p( q
        unsigned int a;
4 r0 f. I# a) z/ k: n        unsigned int b;
. j& F4 A& t3 Y7 Y8 n        unsigned int packet_cout;. p* p# B9 q5 c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  g# O3 ?5 ~" s% _6 y8 n  W5 m8 i- \  d" Z- ]4 ^" e5 r1 n
void read_MSG_buffer(int *baseaddr);5 [: g1 c8 m/ I0 [3 Q- p% @% W
unsigned int count_copy = 0;
8 w; M0 P! Q* _8 f# e* C) l" w
2 G  I0 F: y7 k' O$ Kint main(): R/ N/ s9 N3 n) ]+ ~
{
) w% U2 p- ]% I+ r) {5 |( o2 s        int fd;
; s5 i0 ^& J7 @! {( C        int *mem = NULL;
4 Q3 A8 g- U; O# q5 K) y
: l8 ?3 @. G; I1 S        if((fd = open("/dev/mem", O_RDWR)) <0)5 p* m: {/ Z0 |* Q: `$ l: K  J
        {
! E9 a7 T  M" b; R: p, k                perror("open error");# q9 P4 _6 Q6 j2 u2 b
                return -1;
' ~) C. Q/ k! Q" T        }7 w- l+ z. d' c) E/ I" O, I/ ?7 w7 q
        
+ c6 p5 t+ G( @& S        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 {& \  D- C# ]. o1 u

6 a0 i$ P8 R2 X" Z) x        while(1)
- z: e  @$ r% {6 c, Z        {6 ]6 ?+ v) n* ~; [6 V( f  P
                read_MSG_buffer(mem);
" i& x5 B& N8 x5 Z2 h$ X. F        }                : x9 A" Q5 }& d2 J
}) J0 x! ?' a$ D: C& y* }7 s# n# i

; E1 h1 R5 @. x, O4 u; S( F9 xvoid read_MSG_buffer(int *baseaddr)2 x, z2 K1 P2 x& E
{
, s* ?+ y' O/ T+ y" I        pRX_MSG_PROTOCOL pshreRAM = NULL;
! T3 W4 n  a7 C" r
# V- ?3 N% T' g0 b- v* V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( N! j- i" d/ G2 Q

7 t9 j* I! t3 d: C( @        if(pshreRAM->packet_cout != count_copy)
( S* ?$ Y$ D  }        {
$ d% i2 y+ F& K% P  O4 o                printf("a is %d\n", pshreRAM->a);
5 r9 }+ k! x7 f$ o1 U2 t$ E                printf("b is %d\n", pshreRAM->b);: y( O( f. m, X
                printf("count is %d\n", pshreRAM->packet_cout);
; E5 `$ @& s0 v' e+ J# G. q3 c                count_copy = pshreRAM->packet_cout;& H8 p3 U+ i( g# z9 K
        }) }9 Q( |6 ^! p( ]) V" w% x
        else; _- z! |( R0 \& J3 L+ [
        {# O5 v4 q# n5 {5 M
                printf("No effective message!\n");3 Y! ?+ n7 h1 z+ y5 h5 i1 O
        }
$ @% a5 G& k& b" X! `8 C}
9 D8 `4 j1 T* s: \7 u1 f. n. {& u. e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% U. o+ F7 M! R% q: n( ^
  N4 p6 T9 h. Z9 N; \! p
8 r) u  g; v" K: g0 ]
- o5 [" ~. s! D, Q! L( ?
7 n' u; [4 R4 h( o9 @1 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 11:12 , Processed in 0.041155 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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