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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 E" ]+ u* Y9 X, `7 B

: p) ~+ b! f8 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 J1 C. N# H1 o. z! _#include <unistd.h>
2 h, Z( }* N0 o  n" j/ r' K9 E#include <sys/mman.h>
; }# h' S4 A% a9 o4 d+ N#include <sys/types.h>
! I) p/ [0 V. q  o6 ^#include <fcntl.h>9 W) J/ P% |+ J, W

" K3 F# N/ B1 H: R#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 O3 q0 W- V  g) `! L) p+ u8 G1 s  ~
typedef struct
3 c2 I! y5 y! Y# I! F{
1 t/ T; ^2 t$ ]        unsigned int a;! X/ y) N( g5 n! w, b1 a# Q
        unsigned int b;9 ]9 J6 g( Q1 g5 K/ j( [- w
        unsigned int packet_cout;$ O# d# Z. T  R* V3 g
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( x6 _# a* _: T- g0 w
  x3 T0 h0 r$ ?% Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( ~' ^" k2 K" i0 W
unsigned int count_copy = 0;
" j. Z1 Z3 _# H/ L' R9 `# e; Y2 w9 y( D3 |( `: ~2 X0 F4 |, i

6 S4 C( S' w5 v8 Y" Z) S1 c% gint main(), p) C0 B/ ~# i; Q/ f$ k, T( l
{7 z: u. u8 W# y6 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ L1 H% `: h+ m        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, `& v. N6 @  o5 H* b
% E. G0 H, L1 m  F" u. ?7 L        while(1)
# P# S- `' W0 n/ o: |; R: e0 l5 Z% O! K        {
; s9 d& K, J3 e, O                read_MSG_buffer(pshreRAM);$ P+ J; F5 C! k5 b# O9 ]" e! r
        }               
! y' d% l: A- q6 \. B}
* ^) v% \4 k* N/ M4 b- Q6 z1 A8 i$ d+ U$ g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 d3 B+ ]  j5 N1 l& i4 I
{
  Q& P7 O/ N# Q        RX_MSG_PROTOCOL buf;
0 x, a; A: |' k- M4 Y6 P: H        
* c' M1 P2 R: e$ S. ?  t        buf.a = pshreRAM->a;
9 t% r! I; f+ G* O# s  e# e+ Z1 u        buf.b = pshreRAM->b;5 }  K3 `- _" D5 G
        buf.packet_cout = pshreRAM->packet_cout;6 H0 g2 @( r/ H
        
8 C8 `+ P" X! J4 I1 @! s' Y' y        if(buf.packet_cout != count_copy)0 a- j7 p0 S* M# L
        {
; M. o/ I4 s. `* H7 h1 V                printf("a is %d\n", buf.a);; J& n( b' F& i$ u6 j+ ^% Z3 n4 g
                printf("b is %d\n", buf.b);+ \9 M: v7 U. f$ I0 w/ Y
                printf("count is %d\n", buf.packet_cout);
9 ^& F" w# H+ @! Z4 B9 k+ X                count_copy = buf.packet_cout;$ D7 }; F$ g, t9 g  W
        }
" _, ]4 Q9 u& X0 y6 S        else
- `$ N7 m" b/ H3 a1 X1 U" @        {3 l3 H4 t+ L6 l# i' z6 W
                printf("No effective message!");! t0 u( \( e4 l
        }5 _# [. E3 K, h$ O: t$ ]2 J$ a
}
0 a, O! t( J2 q, ~9 S" U/ C8 b1 u+ e* K" c

/ B! `- |5 c# t; l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& ?7 ~" C2 i/ Z4 H9 [
使用下面代码,对内存使用了mmap函数后:" T  m/ c2 j. Z9 L- Q# k
#include <stdio.h>
9 X% G- O6 d7 s$ K% h9 b#include <unistd.h>2 F; J3 z! N$ Y" V
#include <sys/mman.h>
2 v" S& M1 S5 F( z. q) U+ `* T#include <sys/types.h>
) U$ T2 i7 N; K0 `#include <fcntl.h>
( E; j$ {5 y2 T: v
( V; w( `$ J; c#define SHAER_RAM_BASE_ADDR    (0x80000000)  r4 ?6 e! V: N. L) v) z
#define SHAER_RAM_SIZE         (0x20000)   2 r$ f+ u) E% C( t; u, Q7 u$ ]4 X

- b# q% b- L1 \& s/ I$ ], ^/ f. gtypedef struct
. u+ C  P- j. i5 a) S" A% E{
6 \9 F( ~1 Z7 d5 X" v3 W" L        unsigned int a;+ ?% c8 q/ q' B# X0 W( c: A0 r# n
        unsigned int b;$ Y, K9 p* Q# v6 [
        unsigned int packet_cout;
6 z4 E' f/ ?  z9 b% z! j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, j# {5 p' O* U2 v6 U

. v4 ?& ]& l" r# zvoid read_MSG_buffer(int *baseaddr);+ w- X! W* r) B; d! X5 p
unsigned int count_copy = 0;
4 s0 ?' ^$ Z! j2 P$ b
& z# f' v" {1 u% |8 oint main()& g. z$ k6 r0 R; }
{: Z2 p3 G. A3 F# a" H% w
        int fd;+ A2 g8 k9 u0 h4 M
        int *mem = NULL;
3 J1 P3 E) o3 M2 B. u( L, \% `: K. V9 Q4 x- h
        if((fd = open("/dev/mem", O_RDWR)) <0)
3 z1 ?) @; s3 I  P' S* s$ M3 W        {8 [( O* Y6 K6 N' G0 v
                perror("open error");; P3 Y% _* S/ f9 V, w; f; M! k# b: T
                return -1;
  c5 Q* j6 `* A# o1 @  p7 b        }
4 s) Y2 d" S0 A        2 Q9 L* z: G$ d7 N! u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 L. u7 V' s! b, ~
9 d) B7 w& Y: Q0 F- z  x0 L        while(1); s; I+ {- ^7 {
        {
" J) F' K5 `$ ]! H! \: c& P! f                read_MSG_buffer(mem);
" }6 p8 r0 N  l1 \        }                ) l' Q; I5 F* o& j
}. S$ v9 H4 h& Z; w  r
1 ]$ ]# G" i4 i% ^# e/ s
void read_MSG_buffer(int *baseaddr)+ h9 t. t# M! m
{" |' ~$ E! o, F. G, J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 ?6 P9 O9 V( T6 \6 R! W! m9 u( c* u, {7 `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; c2 g3 T; V' ^7 _3 p; d6 u+ x+ b
+ q8 Q% O% }, x2 \: e9 T
        if(pshreRAM->packet_cout != count_copy)0 W4 P/ V& O( j; f: _0 `7 n1 Q
        {
3 I; Q- ~. M: Z# _) K* u                printf("a is %d\n", pshreRAM->a);( X* `, S: W0 A5 g* c$ J7 B: P
                printf("b is %d\n", pshreRAM->b);, F/ Z, q6 ?$ Z" d% X  C7 |
                printf("count is %d\n", pshreRAM->packet_cout);
# }* v  t. |1 r; |/ N0 V; r* Q                count_copy = pshreRAM->packet_cout;
$ A; N0 O( T. L4 c) {/ r        }
: G/ D& z- l: Q        else" T& ^6 B0 w; P" K/ a; p9 j
        {; j3 M2 t* \$ {. F+ }  W- H
                printf("No effective message!\n");
" W- O) V9 b3 y        }2 A' w4 M/ L6 Y
}* _6 g' P4 t/ u% |

2 w: l8 D7 P4 Z! Q# r8 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
; T- {- j2 W$ C1 t
1 }' W/ O: X" n) J: d: V
1 Y. r" t+ X, B* ^. ]# h) [. ~/ ?+ T; w( V
. ~/ i5 G4 E% S  L, e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 00:53 , Processed in 0.037613 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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