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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / v3 S/ z1 _& t1 [

1 f1 R& L% V% W' u9 E4 cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- P6 v3 J9 r( b) ?8 x" A
#include <unistd.h>
( B5 `7 X: I; q#include <sys/mman.h>
: ?) X$ C  c0 u. A* i9 ^4 g4 R#include <sys/types.h>: u4 g" R& K* l5 z. m# o8 d0 _
#include <fcntl.h>
$ b- T& [. \9 A- b$ y7 N! G  W7 k0 d- {1 f) \% {" e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# {7 {; l; P% k
5 v" b. |% s; {0 ]/ {typedef struct
4 k6 P/ |6 L2 r+ K4 l/ x0 y. Q* L{
: F1 H+ ?* C2 W6 t        unsigned int a;
6 _# t  U/ |3 _* p# i/ e        unsigned int b;; @; ~( G2 e4 q  c* _6 a+ r
        unsigned int packet_cout;3 k8 W5 [. [7 h0 L; Q  n# @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ y! |$ }7 d6 u7 Y3 F
1 B5 A5 y" g& \/ i  i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 B8 h) W% ?# wunsigned int count_copy = 0;( j& [" v/ Q* F" I" J0 C9 R4 {

5 f4 _! E) R" O& |% g! A! F+ h/ I6 C9 C# H: i$ T" {5 b9 J! ?0 d
int main()9 H% \& d& Q* U! h. g# w# S: S0 w
{, N+ }/ b& l( V& N  v  v
        pRX_MSG_PROTOCOL pshreRAM = NULL;  b3 D5 H# M. b2 Z  N5 l" k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! N% k) f) f) {% T0 M+ G' z- y' I; i8 ]. l9 |) B  b/ C
        while(1)% E5 p6 m7 T$ G& V( n
        {- d6 N8 |1 j; F8 L, r* D2 V
                read_MSG_buffer(pshreRAM);" f7 q- Z. r0 L' e* r
        }                , @. Y: ]8 h9 A1 ?
}2 Q' g" ~5 U; j, O! v

: X5 f) E7 X2 G/ Tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
. V' A# [' Y- F1 c6 o1 w{$ g* a6 d* O( l; G- L
        RX_MSG_PROTOCOL buf;
3 }6 M, z3 m$ P) L. O( @) w. G        3 z7 c, c- d4 ?4 D* S
        buf.a = pshreRAM->a;7 U  L* x+ e8 M
        buf.b = pshreRAM->b;
% i/ U# k% I5 D( X+ o        buf.packet_cout = pshreRAM->packet_cout;
! D( V$ @- e! h) ~1 l        
- o. p" y% G5 n# m* S5 C5 }! r! B& v        if(buf.packet_cout != count_copy)
- Z' B! L7 l8 v# Q9 d: Q        {
0 b% |& ]- Y$ F                printf("a is %d\n", buf.a);# z  \0 b0 G+ V% W
                printf("b is %d\n", buf.b);* g$ Z5 b- ?+ T( }6 s& g' i: S
                printf("count is %d\n", buf.packet_cout);
" @1 L' P; t2 Y) _2 j                count_copy = buf.packet_cout;
: }9 ]% o8 @; O4 c7 y- a        }1 `  H, \2 O$ V- V/ ?, t
        else
6 e8 Z2 A: \3 W6 T& V) ]        {
2 @  d6 m' s$ p                printf("No effective message!");
; Y; r; J7 C6 }        }% n  j$ T0 O5 u/ g
}
: S( ~/ c: c3 I# g# G" J% t. z3 d6 x% F2 A6 Q/ G

+ R8 L0 R$ L7 `# b  M% b) `# y' O! X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! N0 B: c  k! Z- |使用下面代码,对内存使用了mmap函数后:
( N0 i- K! A8 _; B( Q#include <stdio.h>. ~9 W" [7 ?" p2 T5 p; ]. @7 s
#include <unistd.h>
* Q) e6 z  z, z8 _' z8 D4 R: Z# X#include <sys/mman.h>0 {  H0 {1 h$ u* ^* I" y
#include <sys/types.h>
4 F. l8 ?0 y3 V/ p9 I: y+ u) a#include <fcntl.h>7 V' M+ }* G$ R8 P" g, d4 s

3 a' w: _9 B/ e6 A0 d#define SHAER_RAM_BASE_ADDR    (0x80000000)
( t& Q- E  i8 c8 j0 |$ P#define SHAER_RAM_SIZE         (0x20000)   + ~2 f( l, k5 @$ x! M- Y# R

/ K5 z9 B1 D2 D) Y* ztypedef struct1 w! ]  c( V- ^  }2 z+ `
{
( ?0 n3 ~' z, Z1 r% Y3 m9 v/ N. v        unsigned int a;" a. h3 R9 T% x) t7 o
        unsigned int b;
- |5 r) B2 d, @+ v        unsigned int packet_cout;
- D* P2 P9 C8 X- S, p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. c; e1 i) t1 A
6 {2 L& p5 H) h
void read_MSG_buffer(int *baseaddr);
+ M* W& E. \5 C( Q7 Ounsigned int count_copy = 0;
1 W- s. a$ E- Z+ P4 a
+ e& _2 y% \! N* P5 [' iint main()" J2 i- E0 O1 p; M- U
{
9 e2 r1 E% U5 c        int fd;, O+ K; p8 h2 N. O" K/ R) y
        int *mem = NULL;! u0 i  g4 r/ `4 C; G
. V2 k- }% U% o7 K
        if((fd = open("/dev/mem", O_RDWR)) <0)3 Z' ^8 G) u  G' c  D
        {
6 o% w* Z" x+ W1 _* t" q4 d                perror("open error");6 S5 |$ }* H  z1 ^' n3 u6 [# X
                return -1;' I" k+ a( d3 f+ h
        }
  z! ?, E) o) Z        
8 [5 @. s: s% w* x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ \$ e- C5 g' P4 V
4 a# S" {, t& \# M1 [+ A. q
        while(1)
+ K/ s  V6 C+ B+ G% O. o        {7 I0 u( m* z3 s$ o1 s5 [
                read_MSG_buffer(mem);
+ n7 Z+ n1 d9 H% D        }               
8 ^5 i8 ]' q3 {) N6 e}
! U% p- d$ s$ C: X1 x3 S; e
# ^) E$ v. h. ^0 T  Nvoid read_MSG_buffer(int *baseaddr)" v# W" p$ {1 _4 T
{
7 [! C9 \) T- C9 v$ T- D5 P        pRX_MSG_PROTOCOL pshreRAM = NULL;
& X# a) X0 [0 s  {# H6 C5 n4 \; N" O3 N! J( S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: y- l. Z; r" D5 z. q2 Q
. t  O) [/ a- c7 s4 h# l
        if(pshreRAM->packet_cout != count_copy)
4 p2 B8 m0 v; s  }        {
2 C/ p# @# \- ~$ P/ N                printf("a is %d\n", pshreRAM->a);. y" q, e. e4 [! d/ N5 i
                printf("b is %d\n", pshreRAM->b);# [6 J  o! I5 r8 J  ?. o. F7 i$ t+ b  P
                printf("count is %d\n", pshreRAM->packet_cout);
+ }$ m7 A& M* r' v1 \9 J7 z                count_copy = pshreRAM->packet_cout;9 K6 V( z: ?  W# n0 F, f# h- l
        }
1 N& W# M6 Y. T, F$ C8 x        else
6 O8 h/ y/ L/ r& S( x1 J1 M+ V0 H/ O        {
! g5 o/ F3 `$ x. S                printf("No effective message!\n");* m# k+ f4 ~# G. S- O
        }; H0 S3 j5 c8 I6 ^) B% ~& W
}
* q% q" d* e" o5 f3 p0 A; ~( H  C; G; Y9 B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, Q# y# o' N/ K

9 i. M% X+ ~! H7 R" @; I. M$ H( |- n1 H: q

( ?- M/ r, t8 G, W+ H
6 [6 h5 k! z% x6 c) w7 N% l# L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 05:04 , Processed in 0.039810 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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