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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% c1 {' E  h& C6 l5 i+ S0 x
6 Q" E' r% G( N) y$ D. X* mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 h  t6 k4 o* i5 l6 C1 ^#include <unistd.h>+ I1 }* L& X# b4 x
#include <sys/mman.h>
  f+ ?" m6 j8 L4 v! O  N#include <sys/types.h>
5 \% K- ~3 D, F- |$ _5 g#include <fcntl.h>
' }0 q  [! K* M" I
' E6 p) b4 w) {6 [2 J3 p#define SHAER_RAM_BASE_ADDR    (0x80000000)   - F' ~6 Y. O5 q; w

" _8 y3 b# j7 C+ e8 [typedef struct& I& |8 Q; C: b
{
3 k8 I/ ~8 A, {' U        unsigned int a;
8 m) q7 h2 s4 a9 U+ j        unsigned int b;  i- R6 x. Y2 R
        unsigned int packet_cout;
2 c5 q! w6 U- W6 o# w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A& ?4 x- [" X* ?. n, @7 b' o7 a- A% {1 {2 ~9 ^" t/ B% W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 l% X# F6 U" I. Q+ c
unsigned int count_copy = 0;
- K6 D" v2 t9 m0 [1 Z1 O$ u/ J

" [, T- ?1 S7 a  H# e8 N% I7 S$ ]2 q, [int main()
8 L) ]# A/ o1 E3 }3 n{
; P1 U" K3 W- I! B! y+ l  u: \3 M! b        pRX_MSG_PROTOCOL pshreRAM = NULL;
  W# F7 S% A& N( U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ m* {) q: g: M/ Y

7 L8 s6 k2 s+ F7 ]$ T: v        while(1)
2 ?7 X4 g5 u/ {2 w7 c        {
: v2 w# C6 b1 L                read_MSG_buffer(pshreRAM);
. m! b+ X# c% t7 p5 u5 r( A- n2 t7 I        }               
  y; {4 x4 x& a0 m; t}
$ u4 g6 F! _( Y5 D7 I& h# `9 Y  }" h5 B- b2 ?0 ]* J6 D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! R& w' f( o- n
{
# c# m1 j. Q! T3 t5 K) H  t        RX_MSG_PROTOCOL buf;% b7 ?9 h1 R# U1 [' I$ e& D3 }. }. x
        8 M* @. Y  j% G* g) a: I0 x
        buf.a = pshreRAM->a;/ ?. X  t; [7 \2 }% u3 N$ y; ~. Z2 H
        buf.b = pshreRAM->b;! r8 J& R  S9 a- b$ J
        buf.packet_cout = pshreRAM->packet_cout;' t6 ^) n9 V9 B' s4 X6 n3 b
        
$ T7 ?% @3 C8 B/ Q. H        if(buf.packet_cout != count_copy)
( b3 b" u& t) z        {$ q) b3 R3 S. o9 D
                printf("a is %d\n", buf.a);9 M: s# b9 F) \
                printf("b is %d\n", buf.b);  N) f, k& _' q
                printf("count is %d\n", buf.packet_cout);- A. p3 _4 V% z" H2 y
                count_copy = buf.packet_cout;
- p+ M) j+ y* `6 t8 Z: S4 ]        }; a4 V; h  Y7 i& x$ T( Y' x
        else! p% i! i9 z6 V; c2 j
        {, c# h! u$ G: H' o* R# h9 [
                printf("No effective message!");, r6 b( m2 p7 d% V) r
        }
4 K. `3 U: ?1 e% A}
: p- O0 o- L6 S3 ]" j& @2 Q1 Q( s; C
8 z  f7 \2 I3 A0 ]  z
6 n! A: h, C+ E# s% F1 E" X3 F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. j8 r0 J+ Z  E使用下面代码,对内存使用了mmap函数后:$ O, K7 I' c! R5 `1 [6 I& J
#include <stdio.h>: N2 h3 [+ f. W2 j( s  B
#include <unistd.h>
- N, J' R0 l+ y" G9 @' D( \#include <sys/mman.h>
% W' R/ O% p& y" g/ d9 Q#include <sys/types.h>
& E4 }6 W4 U- n; `* u#include <fcntl.h>* O  \2 Y4 x& j* L' n

' E2 c+ f7 L% l* N1 s#define SHAER_RAM_BASE_ADDR    (0x80000000)
- U  f: t: }+ X) W#define SHAER_RAM_SIZE         (0x20000)   
  M! Q2 {/ H3 L( S  z, F$ J) }& I% P* G7 X' Y$ C
typedef struct- r6 x" k9 g& f' s% w# [8 [/ R! O8 f
{; X, C$ D: v  V  M( o
        unsigned int a;/ t' L1 X# X2 E1 F2 r  A/ v
        unsigned int b;
2 I$ L( ^: A; t7 U; E4 F. Z7 s* s        unsigned int packet_cout;
- u  D# ^; e) f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; {8 X5 v- a6 d( @! o6 J; N
  S" y9 M  K3 _) @9 ^! X: H7 Lvoid read_MSG_buffer(int *baseaddr);% _9 p( R2 F6 l; @/ A
unsigned int count_copy = 0;
$ G+ H- q8 ~9 V0 K) T4 W9 U. y* k9 }# x
int main()+ u$ A, _3 ], e  }, G
{, z3 d3 K" g/ R
        int fd;+ ^/ n( B: f$ m- m
        int *mem = NULL;; c( H7 m; Z4 n( R' X

+ g" P4 Z) @: @4 m        if((fd = open("/dev/mem", O_RDWR)) <0)
+ `5 K4 b4 e0 i" @# |; U# o' v        {8 u  ]- [( {2 p2 l
                perror("open error");4 s3 H% N* a% i& s% H3 o
                return -1;
4 {! G0 s5 c' a7 v8 }( i' C        }7 |8 Y5 W: E3 l  l
        
3 p$ t( F$ a" |) Z, n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 R, t$ o  U- T
- D' J+ {0 R* d        while(1)
0 S8 e0 o; Z: I# O1 S9 G        {
$ \! C1 X! f# S0 N! y7 P) L                read_MSG_buffer(mem);
" W5 R2 M" p& E1 @$ \$ ~# p  I" P        }                ( @" J$ y# n, \) T% h% P
}
- H3 n$ ?- @0 M! }) v. b  X% d. M$ [3 ~1 k
void read_MSG_buffer(int *baseaddr)
% ^3 F8 I; r& F  G7 t{
0 c, j% L% S& ~        pRX_MSG_PROTOCOL pshreRAM = NULL;9 x! b4 Y8 A6 E4 e

" _1 n4 b1 ?- J. s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! W; W% T7 E& X' h! w, C

9 k) R  j) D& }        if(pshreRAM->packet_cout != count_copy); i0 o: U. w% i" r& k
        {2 l% S% D! e5 ?& y: D8 R0 [
                printf("a is %d\n", pshreRAM->a);6 f) z3 k" w' {7 y6 ?0 w' Q$ Q
                printf("b is %d\n", pshreRAM->b);
  D8 A1 r1 ?, f! \; @. r                printf("count is %d\n", pshreRAM->packet_cout);7 c3 E  V/ l+ e0 V% G' I) ~
                count_copy = pshreRAM->packet_cout;
- H$ U. X) L- O* k8 }! ?* ~        }
2 v% k% @1 n+ W; s8 Z        else/ R* l) q2 H3 l  w
        {
! i* S* Y% E/ @* N5 V" B) C( p                printf("No effective message!\n");
9 \2 J( q/ [2 [5 C        }
. @: Q6 g7 e5 I4 L. q}
/ W2 @% y6 r- j$ t+ ?) M6 o  [: j$ m8 @6 g( d! B
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 D0 o" a6 a3 u1 i* }

# t7 t: `* q' N4 i0 T% W5 P' S- h) {6 B5 {& M6 y

( B+ A( _2 K# a$ G- v! a; V5 O3 G; w  j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 22:59 , Processed in 0.043226 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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