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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % n, f6 {# }: F# i7 h9 x5 z
; E' d/ F5 {4 M+ W
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 Q7 C) W- x0 I- t0 b+ C: y* F6 D( N#include <unistd.h>, u5 O% Q! B% E3 t+ \
#include <sys/mman.h>
- [  N8 C+ b" }- h% a  Y% ~#include <sys/types.h>
/ ~: l0 s) l. N1 o#include <fcntl.h>  b9 U* h- ]  z# Y8 B5 v

) @, y% J! Q4 e$ {( o#define SHAER_RAM_BASE_ADDR    (0x80000000)   + w: \2 H9 ~1 f9 S. l* ~
" b- d7 D1 ^9 I1 M
typedef struct2 F! b! r' K* i3 b6 }% n- n
{3 c" |5 @$ U0 f, D. H# l) T7 P- l
        unsigned int a;5 _. b3 V2 f% V  t
        unsigned int b;. ~$ l3 r5 Z2 K% g
        unsigned int packet_cout;
% [$ R+ R. v3 B: A9 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 A- Q; K  ?6 U& e5 j- z2 C) {
8 m$ V, F3 F9 U% C  t1 yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. o: K( w: K/ u; j
unsigned int count_copy = 0;
) {& C& k( t; M7 b, o. z- y5 f) B3 \2 W( \  ]9 e+ |$ p

1 X5 h" W1 ^- zint main(); ~/ q9 g7 A0 A5 s
{
/ I' [  Q+ B& h        pRX_MSG_PROTOCOL pshreRAM = NULL;+ s# ?1 v4 T5 R9 t3 \6 V% d
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, J, x! H" j* n
. G% n7 j2 e4 F
        while(1)
( c5 O, r# L$ a. G& v: D4 Z" ^        {, j* F5 E" H6 m$ G3 R8 |
                read_MSG_buffer(pshreRAM);& S1 I. N' i5 _4 d
        }                : d; f# s' A- Z2 R
}+ V. f; T% M: ^9 d  o: J* g* l
6 b# J" a4 E$ ~0 l% f. M% F! P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; d0 g9 ~! F8 j' f  \- @8 j' B{4 {& m, h5 S+ S8 b; C6 Q) C2 R
        RX_MSG_PROTOCOL buf;
" T( n: R6 F* J( t. |        ; T' u$ X) B3 N7 i
        buf.a = pshreRAM->a;
8 \& K1 l% P  I& U: I        buf.b = pshreRAM->b;
. S3 O, J, Q0 v/ h5 `( ~        buf.packet_cout = pshreRAM->packet_cout;
8 r: u/ H# d& Y& V( m0 U        
% H" K6 E, T( I- t; e  N        if(buf.packet_cout != count_copy)0 X1 ]2 f" k, I, c7 U6 E
        {& Q6 g6 k! T3 P8 H, L1 o
                printf("a is %d\n", buf.a);1 Z) [" M' v1 b/ `, c5 U. k
                printf("b is %d\n", buf.b);
) z; V. p& b& I7 |: {4 r% M. h                printf("count is %d\n", buf.packet_cout);4 ~5 @# Q9 Y; P6 w$ d) n# n
                count_copy = buf.packet_cout;: [2 L  t; A( n+ f4 Y
        }# o/ y/ @7 q9 ^: U! A/ k
        else
% i3 Z1 H% V, m& f! X4 ^2 s        {
7 T+ c* a7 @4 d! Q. X8 ]7 Y3 X                printf("No effective message!");' q, f6 z+ U( l* }, T. E: Y
        }& z2 J' [/ N' b% k
}
% R: o& A% d; n9 x1 ?2 c
1 S6 A+ N; w! s- x6 L
% m% C: i3 t( o2 {  Z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; `9 [& ?* r# b2 T' s& _. J$ N使用下面代码,对内存使用了mmap函数后:  b! C) Q, p9 V/ k* q
#include <stdio.h>- O# a  R5 y# B, |1 {
#include <unistd.h>9 ]4 d% A9 N$ S; Y+ Y4 T
#include <sys/mman.h>; `8 S* l2 K: x
#include <sys/types.h>' c& x- e" l2 T* x) n- W8 F1 c
#include <fcntl.h>
2 D' ^# b* B9 L  Z1 C0 S! |3 i7 i
9 w7 B4 E3 @4 w0 J3 S, s7 g. G#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 b: U+ l2 ]8 ^, p4 g+ H7 |#define SHAER_RAM_SIZE         (0x20000)   
% U  |2 X  H* |& j6 ^, t
5 f1 F0 v" Q; B/ G. d, Z" C; ctypedef struct9 }3 O; ^+ P  H, R
{
) [& W6 r( {1 i/ z5 \        unsigned int a;
  I, h  T' i- ]& ?. K. n& f0 c2 v2 p        unsigned int b;
  N. ^7 o+ n* T# B: k0 T3 t        unsigned int packet_cout;
  P" z! G4 E" G  k! u" s; }% H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 [: ?( ?! E: }8 L) N

: d2 o7 F6 \& V' O: @6 k/ evoid read_MSG_buffer(int *baseaddr);% [; e+ E4 Z+ n5 p$ Q
unsigned int count_copy = 0;( I  _$ u8 Q7 D9 `; d) m
3 L' `% N5 s4 t, N3 w8 ~0 q
int main()1 S7 g/ j# l7 B. {% v7 H
{! {! [& b) Q% S/ ?5 G# |
        int fd;6 Q) R; V$ D" H4 f/ x2 A% k. R
        int *mem = NULL;
; ^: a) ]; e, @+ ?; d7 Z) R7 m" L& I  f6 n  h- ]. V6 Z
        if((fd = open("/dev/mem", O_RDWR)) <0)8 M! W+ N8 v. h' {! C# f5 k
        {+ q. z  W5 n1 s7 x3 B- B
                perror("open error");
' D0 o7 k, z# ?) G+ p                return -1;
; N. @0 C9 g$ H( s        }
; s) v  M) s% J% c- W          i& \  ?- b% }) r
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 {2 J9 @8 O4 h
9 u: i6 |' D; \7 U; b& F5 i" r* g        while(1). a8 }6 K' v. h
        {
! w. t+ s5 n3 }                read_MSG_buffer(mem);
, i3 M" R3 _8 f        }               
: C" T' P- K2 N8 v% S' Y}
" H: o  b" m0 I5 S, X  b, Z# A, G$ L- @
void read_MSG_buffer(int *baseaddr)
, G! d& s- N: c+ W- O{5 p: D$ z( g5 K5 r  }4 N, b( e
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- h+ p5 N6 N( z9 x/ R) l/ ~% q- [
  y1 B1 O: e4 _$ E. Y( G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' i0 @! \  ]0 ~0 s0 j
$ D- u% M1 h# R4 N* C  \+ _        if(pshreRAM->packet_cout != count_copy): `  u' J8 ?& t; d3 t/ U- y3 F+ z! L
        {8 \3 }/ K7 g8 ?* W
                printf("a is %d\n", pshreRAM->a);5 V& k% r7 M7 P' U/ [: D4 q6 E" g4 H- s
                printf("b is %d\n", pshreRAM->b);
! T& j: B2 I& a' a                printf("count is %d\n", pshreRAM->packet_cout);. J% d4 L% O5 v
                count_copy = pshreRAM->packet_cout;
. Z" |/ k7 l$ K& f+ P; f        }6 V( L2 b# c* Z* o4 |  g5 H! Z, w
        else
7 j! G' u' R2 T        {; X4 k/ S- l  |, _( `' t! q
                printf("No effective message!\n");
" E1 P3 Q: x& C2 T( ^+ G        }) r+ K6 {0 D+ O7 Z
}
% P9 o1 `9 }9 `8 o
- ^: F6 ], x' M8 w7 @没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 N4 D8 [6 r2 n# d
9 Z1 T+ D  r8 ~# P
8 O2 m5 ^0 G5 p6 Z- A6 r; F$ C% L' u/ d9 [  w

5 _* h) T4 y0 h0 r( R3 o+ t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 23:26 , Processed in 0.042491 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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