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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. m+ V4 F* i5 U0 q/ K3 J8 p. b
6 ^1 Q$ A; X% M4 P% oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 [+ |8 P  N' t/ C! |#include <unistd.h>
9 N$ b/ I4 {7 u8 S#include <sys/mman.h>
/ L  N( I+ F! G4 T* b5 s#include <sys/types.h>6 _  t& Y% Y) C+ I7 P" M& n& w
#include <fcntl.h>
1 R6 {  |, d$ }
5 v0 v) H; R1 A1 x+ |1 s! O#define SHAER_RAM_BASE_ADDR    (0x80000000)   
+ i7 G. t2 F) v
$ w( U3 x# J( o' O- @/ O! jtypedef struct% D: R3 N# I- x" K' s( h: I6 M6 X
{
/ Y4 A$ \. B$ ^! ]2 |" G        unsigned int a;
5 R$ ?6 Q3 C* I: F7 s& I+ ~- a; v7 d        unsigned int b;
( t  @& W+ D/ F        unsigned int packet_cout;
0 F3 R8 O; E( G8 f& ~% u5 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 L; b2 B7 M, y) n
/ k0 y% Y4 `: }% H, @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);/ ^- g  A  }+ ?8 M% {5 S' Q3 X
unsigned int count_copy = 0;
2 u, P! z# P* a; @4 f8 q3 v! ]% q% c* h; M7 z+ ?

" k* T2 V1 I5 T: ]3 G: Gint main()
' l/ e" I, j$ z# F9 _' i1 N6 ~{& ?! o8 q8 |# y0 z( q  ~3 x
        pRX_MSG_PROTOCOL pshreRAM = NULL;" {) }, ~$ m* `" k" S3 |
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 N7 X! j9 p4 R4 o1 L& d1 `1 h- z3 B. \- E6 f
        while(1)% }; T. `0 w8 s# n) [1 K* m
        {8 |; g  |" e2 a2 D
                read_MSG_buffer(pshreRAM);9 p9 x- ?" I( V
        }                8 J. `1 s0 b6 v. T2 U
}
0 X% M# k, P, t( @% l3 I
% J0 W$ l6 C/ X& g& w; W9 s4 s9 v5 J0 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! l1 H7 o1 m& k8 o3 ?  X. D" S{/ T3 _7 ?3 L3 o+ T/ d' O
        RX_MSG_PROTOCOL buf;
$ O9 e/ S' z4 s9 i+ G4 }6 I        
! R5 |, b  l" a9 ^! v1 B        buf.a = pshreRAM->a;
4 n1 k0 E. g& i. e# ?2 R) ^' g3 Q        buf.b = pshreRAM->b;
& @3 z) n! f, k7 z* b# L1 r2 s        buf.packet_cout = pshreRAM->packet_cout;, N* t1 w' V, {/ a9 Y
        
* e& m" f, r. `9 ?2 c0 G8 K        if(buf.packet_cout != count_copy)" B% D1 D& }2 V' G
        {
' ?* m, m& `; e8 W3 C                printf("a is %d\n", buf.a);
) e( J2 j5 v( v9 T( ~9 T& `                printf("b is %d\n", buf.b);
1 p: D: P: `/ L- {% F* ?, w                printf("count is %d\n", buf.packet_cout);
: z) Q+ c2 Z: _8 i5 q; Z2 b$ T                count_copy = buf.packet_cout;% O( _# L. f! D# v- t
        }
* D; f- Q" C+ j  _        else4 w" p9 Y$ I) L2 w( _) K
        {4 n2 Z: S: g4 B0 l
                printf("No effective message!");
: ^( F2 @& M# `* I7 w        }
7 U' Z; E; a* O) L$ C8 w8 n# S& {}
+ H# Y. r7 J7 K% @& G0 t$ i1 x5 ^9 l0 y# N. d: E: ^5 p6 f. s3 ~
6 j! g6 ^3 S9 V7 f' b+ M* j- `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" P2 G* T( I) j* o. t$ \3 A* F# x, p
使用下面代码,对内存使用了mmap函数后:
. u( r0 X& t) K& ]$ S% s5 a3 u#include <stdio.h>
" b. u2 y3 U* b#include <unistd.h>2 i, D+ m1 N7 I( U& [
#include <sys/mman.h>
; I0 Q$ R3 }" B4 {/ x) a#include <sys/types.h>; c3 U' q% B  @$ `
#include <fcntl.h>: _+ k  ]' D! T9 {/ A

) n' I8 z0 v: O4 e& o+ W# x. N8 \2 @#define SHAER_RAM_BASE_ADDR    (0x80000000)
& q1 K3 Y: F' e) B! C  g#define SHAER_RAM_SIZE         (0x20000)   ) }1 _- B: {3 N; @% ~

& ~/ U6 z& f# _7 d! ftypedef struct
- @! @1 N: Q1 h: s{
) `& B" P5 ]. h        unsigned int a;
( }* ~- z: U5 I        unsigned int b;
4 \! {0 d+ `( f7 k- Y* p5 r        unsigned int packet_cout;( K3 l; H& V3 e, R8 L: E, m9 p4 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  h' T( d6 l& O6 W" v4 F8 p) s/ f( u7 w3 a# o1 @
void read_MSG_buffer(int *baseaddr);
5 x1 t, k( W- z4 ?4 _% wunsigned int count_copy = 0;
, i9 A+ m7 ~- }+ @$ C
; c1 S+ a5 @1 fint main()
* w4 ]- f) l3 m{: Q" q1 H. |% B4 B' F
        int fd;/ f  W- r4 ?. s$ [1 j& @
        int *mem = NULL;
* Y' K# A# ?$ o: \0 J/ p! r1 L2 U& c$ U7 e& q+ ?. v8 C8 W# w" z
        if((fd = open("/dev/mem", O_RDWR)) <0)
% ]9 u( n3 J4 ]- c2 Q! Q        {
; J+ x% Z$ {' Y2 e0 m# L7 v                perror("open error");) K/ o. N. N4 Q4 y3 A! w3 t  w1 c" o
                return -1;6 c0 o9 `) N2 {
        }
4 ^0 N+ k$ W4 {0 o        
: X7 u2 k1 l7 S7 P7 x& j- A        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. L" P# y( O! E8 |3 e/ h5 u* R

) U1 s7 p6 N( A/ P        while(1)
, U( K* S& i8 e# K( c, {        {! g; K- k* S0 y& Z# ~
                read_MSG_buffer(mem);3 E: m. P8 P: |4 M1 d
        }                ' r/ z7 Y7 `! M* g5 D% I4 e. E& f
}8 F8 t9 P- l5 J) A2 j
3 A  @  W6 d( m% E7 h% \) ~
void read_MSG_buffer(int *baseaddr)! m+ I  N+ {# j" Z, {1 D
{# o9 x  V8 x& p2 T  ^) W* r2 o
        pRX_MSG_PROTOCOL pshreRAM = NULL;& B( w+ K' J9 d8 ?" L; ^+ u
5 Z. e: c" o7 n9 Q9 I
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 o/ E2 {" r& J) r* U5 X7 `) [' |
1 G4 b; f# i# d; O
        if(pshreRAM->packet_cout != count_copy)
5 T0 Y* V* j3 g        {
. m: e% P% {! J( w                printf("a is %d\n", pshreRAM->a);: x* i  }# t/ d6 t' f4 X
                printf("b is %d\n", pshreRAM->b);+ D! X3 S, O' k7 n! K$ x; r, l
                printf("count is %d\n", pshreRAM->packet_cout);0 `; E: h) X) W: |* T0 C+ |
                count_copy = pshreRAM->packet_cout;  q  X; ?1 E6 h' y9 S2 N
        }
9 C5 _: S0 t  h  h        else
0 G, x) P9 }" `7 v7 V  E) A8 E        {
8 F5 P  ]9 }$ [7 f. L) Q# X                printf("No effective message!\n");
& y7 ]+ i  B) K; |, x        }+ b" K7 c8 D4 k
}
( D/ Y* j4 G: P- G2 y1 v& g" k, H+ l$ {" p+ L8 F: _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- x9 e1 x) N! `1 p+ J, n9 U# n/ t2 V) R# }, }" ^0 D* k/ i& y
6 c& S- s" |/ V( @# V9 K
" C- `0 ~- y! f3 W7 J' K# q. e  ?3 p

6 v2 V% f6 D$ F5 x) p: b) @2 q+ {1 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 23:24 , Processed in 0.040594 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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