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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & o/ }% x1 T' n) G  ?& m
5 o/ ~- L- o' R# V1 w$ o) `% U4 P
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 T7 a+ X+ }1 F3 H& Y/ g9 Y
#include <unistd.h>
; o! x/ P# s( i0 {; Z- k#include <sys/mman.h>
. Z4 p: b( ?* J. ~#include <sys/types.h>
: C+ i1 z& f( @7 ^& h* v# j  P#include <fcntl.h>% i& o8 K. U  y: m- S. o
" g" N1 ?: E; a* I! \) b: p
#define SHAER_RAM_BASE_ADDR    (0x80000000)     ?8 T, I3 q% x! B! |6 k' G7 H/ H! J
. v% X$ ]& \7 S  J* _
typedef struct4 L4 j3 T- V8 c$ F
{
; e* o  x$ \/ b. @6 Q: Z+ X% A1 N. o        unsigned int a;& j) {# ^# }5 {+ E. q
        unsigned int b;9 k0 J3 U6 S0 e% ]% V7 L# T" B9 Y
        unsigned int packet_cout;
( x2 K) i; {" D* @  g}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 ]' K" ?% F2 ]3 X
& I2 s% N' {6 J3 @- o  \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ L3 v1 u/ u3 a
unsigned int count_copy = 0;" h  J6 V3 N! C% K9 T
6 ]( N% G1 A6 H' x2 F( R  Z  X

4 X' \  F1 s: E- x- M/ xint main()
9 w( e/ ~$ r$ C; A{
( ?# ]0 e' V% K- y- a" }        pRX_MSG_PROTOCOL pshreRAM = NULL;
' e# _4 O" C& o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* E3 C- j7 w9 Q6 ?
+ f2 w! O/ p5 d: l# V7 [# K: n/ x! X        while(1). b4 k5 [* c" C, H3 E! |
        {3 U* j3 C; ?1 K% }
                read_MSG_buffer(pshreRAM);
; w* r- [" i' r        }                # a% g4 D. y7 r' G: u/ [, b
}3 L3 f; e/ Q5 r* C. p
7 U+ J: m# z4 I* K4 P# ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
+ Q' R- o7 l, \' u' p# m{3 K+ d7 L  Z4 h7 x! F9 j4 r
        RX_MSG_PROTOCOL buf;' `8 x0 r1 t7 M" ~0 A/ [' L
        
6 i' L& W5 @0 K2 Y1 r: X9 n        buf.a = pshreRAM->a;8 w. x" e$ f  I: Q
        buf.b = pshreRAM->b;$ Q" Y0 l- S0 S& ^
        buf.packet_cout = pshreRAM->packet_cout;4 X" R6 R2 w0 G' `1 A$ r
        6 D+ c* s; {& y2 l' Z( S, W6 ~7 p' H
        if(buf.packet_cout != count_copy)
! k8 w5 ~' F  D3 m; e7 w0 E2 d        {! Y' m" k$ ~: [3 b
                printf("a is %d\n", buf.a);/ `0 E4 S. i" L- s: y
                printf("b is %d\n", buf.b);
0 J6 c: _: i; Q                printf("count is %d\n", buf.packet_cout);6 L- i, _3 @- w9 H, Q; G3 C
                count_copy = buf.packet_cout;" N6 g/ t7 a" C/ e9 Y
        }+ L# j5 |( H1 [. S# S- g6 s6 J
        else" l& S7 ]0 [  q  Z2 }2 P4 q1 S& c
        {* m0 G: e& u2 {0 ]
                printf("No effective message!");
3 e6 w. F, b' P+ M- `        }4 l6 y# M2 R; W' d8 L5 w0 f4 ^  l' s7 S6 r
}1 Z$ k# d1 a& ~( U0 X( V

& D/ ]0 U6 o7 _9 G7 b( L1 B, y8 i+ p1 K/ n. j
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 P/ A0 w% q3 h( l
使用下面代码,对内存使用了mmap函数后:& g6 K% r; v3 ^
#include <stdio.h>
6 |+ [. a8 b3 t! S$ L#include <unistd.h>
$ B: D# q9 G3 m) j/ h  q#include <sys/mman.h>
  m8 u( D1 j: {1 U2 X! r#include <sys/types.h>, y  Z6 v5 c8 A$ V1 W0 \8 A
#include <fcntl.h>
. A7 v7 h5 i0 F: v6 Z; v! Q  v2 X8 g) ?, k" c
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 H/ w& Z: F* T. l+ H, j* W+ V" E( q, K
#define SHAER_RAM_SIZE         (0x20000)   7 t0 D1 Y0 w+ Y" i0 }& \5 e
$ B4 |$ Z7 y" z+ k
typedef struct
" t; [# N" s* g) ~{1 G1 R9 E' N% Z" H$ o* ^* {; X
        unsigned int a;
9 E9 d1 A5 O2 w- ^! Y        unsigned int b;# p6 ?& }% O" v3 D# m& ^$ H# _
        unsigned int packet_cout;
/ |" B+ L; D: A5 W/ ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 h& Y7 U( S4 M# J! A7 i
$ b' W) Y! g/ x. X1 @6 s& pvoid read_MSG_buffer(int *baseaddr);- H7 Y6 Z. S$ t3 N% h1 I: x6 F' r1 O3 O
unsigned int count_copy = 0;
( u( _& b6 P5 A) X6 _$ b" R6 O
; z0 x( j3 l% gint main()9 h) d0 ]- p0 ?6 R+ ?' i
{. I' G, V! x- q8 k' k
        int fd;
+ i7 V( S+ [6 A# |& |: g- R2 T        int *mem = NULL;  V7 L% z) ?9 {. {; f
& T' v  f& l4 \7 Q1 T! y: H
        if((fd = open("/dev/mem", O_RDWR)) <0)3 u1 S( E. y) _0 B% {
        {
1 y% w% w5 {, d) W! I5 F  Y, `9 G: F                perror("open error");
1 G: z# |; {. R; K9 G- T% g                return -1;) y+ b9 @: T* d( C5 J. t
        }: @2 z) p0 T1 {
        7 P& J. j9 W) w! [( J2 w; x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 y2 t* `# C" d2 v0 z
" N6 p, ]+ ]7 _6 A0 \; Q
        while(1)! k0 O6 ^- {/ z" a1 Q
        {/ Q9 J" x# C6 E: O9 _+ ]
                read_MSG_buffer(mem);
+ B: @2 m' U7 ^, i        }               
  m9 l" K/ k' u}9 M9 c6 N% c9 g: y) K2 A

- R# }& i" f( U3 Svoid read_MSG_buffer(int *baseaddr)
# x& Y8 c  |) W( o4 X( o* a{
6 @) q- b7 `& y, l( c, k! B8 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ d- s+ a, {9 F% j+ V8 ~+ p1 i& V/ K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 z/ R. Y0 T3 W8 j) n) w: H( W6 C0 w. X- u4 j5 t
        if(pshreRAM->packet_cout != count_copy)4 S, U! W/ ]; v/ t/ F
        {
  z# E& E, `( n6 _5 I: R                printf("a is %d\n", pshreRAM->a);
* {1 Y- _4 N/ S; R8 ?                printf("b is %d\n", pshreRAM->b);; l2 G) s# w5 V
                printf("count is %d\n", pshreRAM->packet_cout);+ G# k! `# T& u$ H9 y
                count_copy = pshreRAM->packet_cout;
5 u/ d4 [- d: L( V& \        }
2 C" J" o- V, i* c8 h9 A4 ~, `        else
  E6 W9 ^- i' l9 T$ T, ?: u        {
/ \6 i' Y, b2 w( M" m  K                printf("No effective message!\n");9 h6 Q8 o5 M5 d2 f# n
        }( w8 I. ~5 R4 h9 b! X8 W
}' n9 C2 l7 I# H6 V5 U! k% Y
: j0 V# ]6 V0 p. n" b; }$ U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- n) T5 Q  v3 m

- [7 W$ W9 M) k3 I& d$ Y
: {; G, E& M( j3 p, K- v8 ?" D: J8 v
/ o* H* G& ?) ?8 b) P8 c  P; Q) H) Q
! D5 f% Y; W' l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 16:40 , Processed in 0.038102 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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