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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / A5 H2 O+ d* d1 b  I

# w* B% i4 |6 n; o4 p# aOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ c- A3 d, A: _4 s( r; Q
#include <unistd.h>
& B0 }% H1 H6 C, v. n4 _#include <sys/mman.h>
  U$ b' G" b$ o/ U#include <sys/types.h>
% a5 A) a! p0 i) U/ c3 z9 m#include <fcntl.h>7 J/ N+ |2 W2 Q8 ]$ S5 P

5 J; i$ S4 u, D9 h( y3 u#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 p3 a8 x* p1 i. T+ D
, h5 ]8 e- d; e/ Btypedef struct
3 n* W* m; B. X9 b2 Y4 {& F, V3 K! P{. B2 n0 R5 P9 K) v8 M
        unsigned int a;0 Y+ x0 G$ w1 x, L  W! ?
        unsigned int b;. m' s# J3 d/ o( o
        unsigned int packet_cout;- [6 E. b& C8 h! O$ P8 q4 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 R; C. k5 V: C- Y8 z+ p
8 b2 d$ C6 v1 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( W) b( C) k/ a, F
unsigned int count_copy = 0;
$ e' ^$ w+ _6 o) T$ |5 I5 m2 l6 v, m8 O2 n) w- C

3 ?; i+ {0 C0 y$ Yint main()5 U$ Q' k+ b9 Y6 R9 O! V
{
1 t0 D# M# y& d7 c4 S8 y        pRX_MSG_PROTOCOL pshreRAM = NULL;
: V( [  {% N! i; e( X. C! E  ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
) R1 N' p: l2 p  c* w1 r7 \5 Y( _- f7 s3 D& u
        while(1)7 p- s7 ?/ d. Z. z3 Z" }
        {  u3 s* @# E- {2 h: |$ |
                read_MSG_buffer(pshreRAM);
8 o0 R6 M9 e9 c6 \5 d  X        }                8 G6 |( {9 K, s' A7 E  F! y9 R
}
9 t* N& a) b$ h" k/ s
2 A  R3 X/ b; y; \/ q) O. y8 U. m* E  mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM). ]# K" _3 H: M) `
{
& x/ E2 [  h3 b8 M1 _+ l3 L( z/ K0 L0 V        RX_MSG_PROTOCOL buf;
! ^& S7 t" }% J) j2 s* ?* M        
1 M' k% l7 o- R1 _        buf.a = pshreRAM->a;
1 p- {" d2 ]& n        buf.b = pshreRAM->b;
# k$ ]; C. u" k5 S% P        buf.packet_cout = pshreRAM->packet_cout;2 F8 j2 N' C) F, m) q. x( I
        ; a6 `# h1 j- Q5 b8 [
        if(buf.packet_cout != count_copy)+ ^$ D- [, K& u
        {
; b% ~" k2 S- A: z                printf("a is %d\n", buf.a);
; y7 \  z- G/ ^, T4 _                printf("b is %d\n", buf.b);% p3 `. s" N$ a2 J; G, w
                printf("count is %d\n", buf.packet_cout);
1 F7 M! v- a* S3 ?* B, o                count_copy = buf.packet_cout;
# j, J; |( a% `' X' e9 J        }' [4 V1 K5 z3 U( w
        else9 z5 {7 P" m/ d# @
        {. w0 M; S* l* n2 B9 W
                printf("No effective message!");8 k1 c  l5 b; _7 [5 ?" l
        }( M1 [. }4 h# n  b1 p% [
}4 Y; z2 w+ ~- d6 ~! ^% S( U

0 R7 L0 t/ ~; A1 \
: D9 G" |0 ^/ O2 S: U. T但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  Y5 t8 O3 R4 T8 i+ e使用下面代码,对内存使用了mmap函数后:
3 F" P  l; ?, U: {7 n1 ]! m* T7 s#include <stdio.h>0 q2 H: |) _1 O3 L& C
#include <unistd.h>
6 h& B1 I5 x7 q; @" a0 i# [. V. D#include <sys/mman.h>
, Z. @/ U1 f7 f" d#include <sys/types.h>  `1 g- ]6 H! s# B% X2 |9 |
#include <fcntl.h>
' u( c' X* s9 c. Q( Q( J$ [; L* u1 [6 O' w. y1 r) h
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 p! H* ^7 a# G$ l9 G4 ]. m+ }
#define SHAER_RAM_SIZE         (0x20000)   1 R8 @$ L$ n% T. _* [- t' c" r- W
; U& V8 I* \+ b( w
typedef struct1 ]6 z; _/ ]  U  g9 L2 A; M
{& D2 H4 V6 [6 p! j  V  Q
        unsigned int a;. f5 [' o& g% E3 \, Z
        unsigned int b;3 Q; B9 j- _6 K
        unsigned int packet_cout;
, k% t) n3 R0 m( Z6 O& H5 x+ h+ K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 `: e+ j% b  Q0 ~  ]1 w- W; \
4 o: q. T  V2 X$ |: f5 A
void read_MSG_buffer(int *baseaddr);! C1 P& ^2 A2 e; ], J  x5 V
unsigned int count_copy = 0;
- p. F# a/ g. ], T: q  G2 y
: j5 L% x* d2 B* i3 L5 Nint main()
# A" G- F9 V2 e. {{1 z9 a- D5 T  F5 }) R8 S
        int fd;  ?6 s, x2 f9 B5 ~% k1 n( D
        int *mem = NULL;2 ~  x0 F+ P5 _5 X5 e

- t2 Q& h3 s. C        if((fd = open("/dev/mem", O_RDWR)) <0)
, r3 Y7 z. q$ q        {+ M4 M3 Y  U6 M) @6 p
                perror("open error");
% q7 k' ]( T  B                return -1;
, M# Z: P: w+ X* V; G9 U        }
9 L! S3 g# }/ t        
4 g; A# B8 T# e( y8 Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 g& A( R: |4 m; e

. l1 O2 X, K6 L2 C% w        while(1)
% O+ U  U* R3 E- Y8 D7 G  m        {# g0 z: u' Y! K& h6 j" @
                read_MSG_buffer(mem);6 f8 d# t( D: S/ N* T3 ]
        }               
+ i% O( G' Z" G& D0 P) R}" c  ?- ?* a8 D* T& @: @& C
# D9 K6 e5 v0 ^( q' C
void read_MSG_buffer(int *baseaddr)$ ^& z2 Q- w  }4 m7 F
{! R- A& ~7 r' i! R  c: ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' H$ [% X0 b- _. r  f  ~! u7 L3 t! V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) ?5 `7 @- C1 g3 s

1 X' b* R2 k0 \" S. K        if(pshreRAM->packet_cout != count_copy)$ m8 H1 @# @3 }
        {
$ o$ `: G: }1 O                printf("a is %d\n", pshreRAM->a);
$ c. `. n7 W, i5 x- ^2 t                printf("b is %d\n", pshreRAM->b);+ J' ~7 g6 G5 K
                printf("count is %d\n", pshreRAM->packet_cout);
  w$ o) S9 a6 x                count_copy = pshreRAM->packet_cout;
5 e9 W* C  d! @4 W& c' G        }
% x1 p, K4 W+ q4 G5 e0 |5 y1 m        else( q# c1 o6 D- l/ f' @! L
        {# }& v7 K  i5 G( @' i% A
                printf("No effective message!\n");7 J8 s7 y  S, M+ q8 j+ j/ q) H
        }
* j5 c) t9 ^6 s) v+ o& y2 {  }  f0 `}) W! [9 f1 H/ {6 ?7 _+ x( Z
; j7 c8 W6 j9 c2 h) Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 L" x( p  |( O8 u# n/ J! J8 Z  r0 b3 p

/ u  ~; Y. n% H
4 [/ S& X+ Y' F$ M) T
6 A* E3 U4 N( m& ?. o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 04:57 , Processed in 0.037867 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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