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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! ]6 v  Z5 h7 {( n/ V) F: N" [+ v9 J

  N( Z) e: r$ x$ S6 V6 Y, POMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* h! J. w" y6 \, ~1 L
#include <unistd.h>
, s7 h3 q: A" U# a+ K#include <sys/mman.h>/ |% T) N* T+ O! W
#include <sys/types.h>
0 p: K2 S: ^; K- U7 S#include <fcntl.h>
) X: o5 s, D! ]$ i, b/ c0 `2 `1 v& p2 p4 j
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 L5 u' T- Q$ p3 @, y4 w: t4 F! @/ |0 b/ v$ l1 O
typedef struct0 G$ h3 H, e, S! h9 e- `
{* ^/ H9 ], v' o- f/ \; g" E9 J
        unsigned int a;9 D' u6 `9 ~. N" W2 Z7 E: J7 n" b
        unsigned int b;
! p$ }- E+ J$ A; v, {        unsigned int packet_cout;
, n$ }+ d! T" W  {! P' w  l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. s2 i3 B  i# b2 S6 Y
/ _2 V4 Q% d5 p9 R( G! p0 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" E( k6 c9 q  eunsigned int count_copy = 0;6 q- j& h! U& {# z- y! n0 j
4 ]9 z( t- u0 D. W
/ ^9 Q" J6 \, b
int main()( v- n" p/ E0 |/ T4 n; C- A! r
{
; w! g7 p0 m" d" ~) _- k        pRX_MSG_PROTOCOL pshreRAM = NULL;3 [' z+ q+ s4 d6 l3 I
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 a( ~3 [5 ^; Z5 T1 a  @4 u

1 M. x* C) c: f9 w        while(1)
8 Z6 d4 \- b' \* D# K: G( A        {
3 `/ G& K2 R7 V' N# R& @- d( K                read_MSG_buffer(pshreRAM);1 e+ {9 t$ e* J+ r6 w
        }                8 B; }$ x5 q4 c, z
}1 n/ r. e; p5 x# A/ a

% O9 V& `7 Q5 P' Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! L8 H' A3 _% A2 `0 i. Y{5 t7 s7 R: k  I* d0 Y) M5 L) Y! p5 U# b
        RX_MSG_PROTOCOL buf;! j7 w" F7 G, m1 F% a' {2 E
        # u% n' y% g# C: ^3 B
        buf.a = pshreRAM->a;
1 i0 A- Z1 s/ n. N9 H+ x& M        buf.b = pshreRAM->b;% p* o+ J' K4 E& M1 M8 W+ C
        buf.packet_cout = pshreRAM->packet_cout;8 H( k2 k, c; ~7 c+ D( K& I: y
        8 O- m9 G9 O7 m3 d- F+ {2 a4 W- g" {, L
        if(buf.packet_cout != count_copy)2 j* |6 e+ }" J4 B
        {
% I% g3 g/ U, [) p! U; Y0 K) {/ \- v/ K                printf("a is %d\n", buf.a);4 i0 G+ @4 l  G3 j  F7 {
                printf("b is %d\n", buf.b);
6 ?# g* x1 C0 Y) b9 N, [5 v                printf("count is %d\n", buf.packet_cout);' `7 b; l# `) S1 {0 w, K* y; T9 X7 b9 p
                count_copy = buf.packet_cout;
- v/ E7 C; |* Z$ q" P        }
! ?6 g+ F  J2 K7 Q        else
' }3 T3 m& [' I3 l3 Q8 L) _        {7 N2 A1 v+ D4 A: B
                printf("No effective message!");
7 b/ X" m( w+ d4 P$ i        }
1 |5 P6 G3 [% g4 C( i9 x}
- N/ Q6 V% J# T- @( J# b; `/ n5 B3 w- ^1 q; _' a

9 ?& K& L/ B# X; d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 ~0 Y4 d) }/ @
使用下面代码,对内存使用了mmap函数后:. j9 B$ A0 d( G
#include <stdio.h>6 J+ i* @1 H! Q
#include <unistd.h>. H6 q* n, M7 w; B1 r9 a
#include <sys/mman.h>5 E3 h- \" E" K
#include <sys/types.h>
% i' `: E1 T/ }5 t  Q5 T8 h#include <fcntl.h>
/ \% d8 m7 o( f9 y2 ~/ B
+ c7 e* i1 B3 K- i, ?#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ ?9 k$ r; {4 ^8 y+ Q8 Q, z: ~0 \2 o#define SHAER_RAM_SIZE         (0x20000)   
) n2 Z, ~7 {7 S! F- _, m) T: @* Q6 m4 R5 K! T2 e7 c* d
typedef struct
$ R- c6 P# t" g1 H- \{
- m/ l: \. f! H) f        unsigned int a;. N0 ?0 o, h/ v
        unsigned int b;
! N3 A) r- F; o+ d8 q% G/ G9 _        unsigned int packet_cout;+ a1 O. {* g. v! t. E, A2 F. H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 [' }8 [, N( P# N! Y. V

% n9 j2 ]  c" N4 B+ z& ~; p0 gvoid read_MSG_buffer(int *baseaddr);
' J8 s# c( C% ~2 `& _unsigned int count_copy = 0;
% [+ J$ o" l; S1 p+ u7 w+ {- G' G0 |6 b2 f, W: e5 B
int main()
* `. i3 r/ S3 ]' M& D$ L{: I, i; |+ b2 C# F9 ]+ ?" P
        int fd;/ y. f) }- d2 G$ \
        int *mem = NULL;7 k% J# `$ ?$ \' b$ e: |* N& R! c

3 z! a3 p: `3 \, ]" \        if((fd = open("/dev/mem", O_RDWR)) <0)" Q+ H1 U$ `0 L
        {) |: E: o! p- k
                perror("open error");
) d8 x1 T% _+ O' O6 Y                return -1;
  _7 z% ~! y+ `2 j+ j( ]. M        }1 D1 e) W7 O8 `+ p
        
: J/ F7 G9 ~7 A  h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' a' Y' G( \# K: B8 ^  D% k0 ?2 Z; V: h) N, |
        while(1)/ Y0 a  v1 f5 T/ {" O. v
        {* x3 N& E2 w' s0 n8 C: W- T4 W
                read_MSG_buffer(mem);! e8 V; X+ B' J0 ]2 o
        }                : }# O8 Y$ S5 u, j# b# {1 t/ |
}
+ @$ W, g; E+ ~3 l" A) U% i2 F$ o" e- e9 o2 J, d* ~
void read_MSG_buffer(int *baseaddr)% P) X& B8 Y# a( E3 j) H
{
  Z5 [4 V0 D( W/ c& j: U        pRX_MSG_PROTOCOL pshreRAM = NULL;* ]/ S6 e; k" N4 Q

  f" D9 @2 h8 i* ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ X% K$ S  z5 M  a
7 A$ W1 \: h1 x: W0 H% [  P- n( R
        if(pshreRAM->packet_cout != count_copy)
5 a8 w/ S/ u1 m5 k3 y' K; ?        {
6 V6 T: i- ^8 X' s5 H                printf("a is %d\n", pshreRAM->a);
* c; c/ {/ ~5 z. H; g+ H4 R6 A                printf("b is %d\n", pshreRAM->b);
. u+ W* \+ P  x# J, f, H% z                printf("count is %d\n", pshreRAM->packet_cout);
1 y0 q* s6 W+ k% g                count_copy = pshreRAM->packet_cout;
6 `/ a& r0 U7 ^$ m        }
( N4 J) P2 _7 y- c9 X: l        else
7 }) v, t8 q) i* J9 Y7 @- Y! B        {7 c% V, c9 N/ r: Y6 o' w
                printf("No effective message!\n");
- m, l8 S) g0 Y$ X1 i% S) i, @        }  A/ T/ m- c% ]" R) R+ x
}
2 D$ F3 c6 y+ p) D6 F  w6 J4 U9 K' [; C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# t( C6 r$ J& B( d$ v
" m. [, W1 o7 v' `: {# f; `; V  D1 b
* p) z9 E) R6 z7 |7 r/ ^% A

! {- p6 h# l. s( a: j5 f" q3 L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-10 11:49 , Processed in 0.040146 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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