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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ; |6 [) P3 ^$ E, j! u( u7 J& w( E9 O  h
$ q8 Y3 J2 ^, B' o& z/ a- B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! H$ R! N, y8 X: i" j" V9 e#include <unistd.h>$ {# Z& S! P( U' T
#include <sys/mman.h>
9 R7 i. X6 L3 s1 n7 B6 v( V0 p#include <sys/types.h>
) J. L6 {2 ~: L3 |( Y- `$ {#include <fcntl.h>
# j# @1 p6 ?; M/ g( b, G9 H1 ^& a6 c% |5 o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 ^+ L7 P, L; U- V; N& ]; a( x1 D8 {6 g& Z! D
typedef struct
) e+ c; m& s4 \" ], U" U/ _  R{! U/ ]9 L  \  ^+ ?
        unsigned int a;
2 s: n4 {4 X+ P* f8 Q( v, o        unsigned int b;: V/ X* e% w( U0 Z
        unsigned int packet_cout;, }0 i5 P/ _0 X5 D: Y; V6 \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( `  [* d% `2 K' V9 I
. _, ^" T! m$ c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
; B& K+ q. E$ U8 s6 N' Junsigned int count_copy = 0;
9 G* c: @9 {' a9 M# l: h
9 b4 ^8 v0 `3 M  b1 \0 z* y( h) z/ g: N  p: \, W
int main()8 ~) X$ R9 Z! M" G) [! b
{
; ?$ |/ u8 E6 a  B1 }5 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ T8 s6 H/ R% H$ @: D" P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& V. k( u/ `0 M# f$ m$ s

2 \; J8 X4 A. _! q' K        while(1)& O3 P* c- f' D
        {& _4 b! k: K8 h) U4 Q
                read_MSG_buffer(pshreRAM);/ U/ i! o0 q4 y, _  j+ w2 b/ A9 `
        }               
+ p. Q6 A: W+ U' w& ~& c* f" ^}
: f# l- g% J/ D1 s3 g0 k8 U* l' a, W1 J3 S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ n) U  K" P) G+ R! i3 a# g% \{; I# Q% p3 ]+ l" `8 b
        RX_MSG_PROTOCOL buf;- g/ j! ?* q$ |2 w9 ^! h' ]* t
        
+ J2 p4 q/ t$ c2 q0 p        buf.a = pshreRAM->a;$ m% E& _4 m8 H! c* H' }* r, s- Y
        buf.b = pshreRAM->b;
4 U; w2 v8 ]/ Z5 r6 t/ ~6 ~        buf.packet_cout = pshreRAM->packet_cout;
. x; Y* O! `3 [1 u1 B' q) U. y& y$ K        
* j, q$ \5 v. k        if(buf.packet_cout != count_copy)3 ~( B+ v- N! J' U5 ]+ p
        {4 p7 o: p. b9 A' [* V% W
                printf("a is %d\n", buf.a);2 `& g+ L# G( a7 U, V4 g* {
                printf("b is %d\n", buf.b);
. P4 G0 Q+ W& r6 I; C                printf("count is %d\n", buf.packet_cout);: s/ O1 e. ~+ Y7 L( J
                count_copy = buf.packet_cout;
( t& l7 j2 O  a4 D" D" @( V        }
1 n( K! S; T/ \        else
+ O) P. C. q( g" L! E0 `        {0 x& L- [4 y1 R' N: A- |# N- ^
                printf("No effective message!");
( \) q! m- x8 s; ^! v! @- w) z        }
& N  `% l6 H  _# `; _6 m}4 v# Z$ H; p8 r' {. u

3 k' m  h( r, ~  A, k: [
  O6 o/ T9 k8 c9 Y) i$ }9 G3 }8 f但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ M- M# a" M5 S5 @7 k& F6 P% `
使用下面代码,对内存使用了mmap函数后:) z) p; `  Y! v  F! Y
#include <stdio.h>
$ P( D! k* h7 x9 A#include <unistd.h>
( z1 f& m7 ?' M1 U, \* J7 Y#include <sys/mman.h>5 o& }* \- O6 O& n! z+ T
#include <sys/types.h>
& f5 C$ `2 o& `/ D#include <fcntl.h>
, x2 D3 h' M$ Z3 ^( U
. b$ R  `+ i$ u" W#define SHAER_RAM_BASE_ADDR    (0x80000000)
/ \& X; d  m# L2 z$ V#define SHAER_RAM_SIZE         (0x20000)   
1 O( l/ b5 Y( I" ?3 ]8 B- H8 k  j5 z2 \
typedef struct
3 q. W" k$ M0 p  x7 @: K& [{( m5 M; I( x! n2 p$ x1 H
        unsigned int a;5 D4 W# T" E- d2 E( u
        unsigned int b;" W9 ?5 i0 g1 h' y
        unsigned int packet_cout;% {% O9 G+ a+ ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ v6 |0 i- w: g& X; Q0 m, S' Q
$ s3 _: ?; ~" u' j) Gvoid read_MSG_buffer(int *baseaddr);
. i- x; V( w9 G( p+ Gunsigned int count_copy = 0;
2 a. \1 F2 ^* p& a) f0 h  m2 H& M# L* ^- j6 U* B
int main()
6 j7 }! Z  C5 b# G# [{( V% J0 B% B; H7 A7 F
        int fd;
& u1 j* ?3 x- d+ K        int *mem = NULL;
+ U3 P, ^  W7 E5 l! H9 n  Y+ W( f+ v
" ~& u" P# M2 h* |9 u        if((fd = open("/dev/mem", O_RDWR)) <0)* F/ O7 Q( z6 I$ U+ W) v: B9 u
        {
& O# }1 ]/ x% \, ~                perror("open error");
1 d# M8 ]. S3 h1 v' E) b                return -1;6 c7 Q7 D, p  J' k' P
        }
& Q/ X1 B: n/ X        " `, C) M- e8 l2 M1 G. b
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( R; d  P  W$ h2 p
) C6 v3 @  r5 J        while(1)* G- i) Q" @) }& e2 E( k
        {0 t  @& A) D( @9 ~2 ?; k1 L
                read_MSG_buffer(mem);
# a5 K! U. C5 x7 Q4 p: _0 ~# `        }               
0 J; H1 {  X% a7 w5 g1 i}" I+ s; }' J& L* ^5 y1 ~% H

' Q" E* }2 S6 r2 _$ z3 g: h; t$ Lvoid read_MSG_buffer(int *baseaddr)8 Z+ X$ \- U' w* B, g( n: Z7 ~  a
{# k- V" C( P/ a6 ~$ g7 ?% ^2 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! U+ Y, l. e  q: y/ Q* ^6 d
3 i5 F' x9 ^. m& a! s( \# \6 V) ?        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 b0 |. w$ h# o# C
" r% z6 {0 Z0 ~+ D9 b% O* C
        if(pshreRAM->packet_cout != count_copy)
6 X, Y# }# z- @, n' v, e' [        {
0 C3 `1 ]# B  ~" |% j3 P                printf("a is %d\n", pshreRAM->a);
# `. h3 K9 d5 y+ {6 V. ^% ^+ o                printf("b is %d\n", pshreRAM->b);
4 v* i* s0 ^9 }                printf("count is %d\n", pshreRAM->packet_cout);
0 y# z, a  I/ G* u) H" _+ n& E. s1 q' z                count_copy = pshreRAM->packet_cout;
( O6 o: y0 v9 c1 S+ ^$ ]/ L; N0 n        }% s4 R: h  _1 v, V( K: X
        else
% D/ S, |  B! I# n& N! m        {! P2 f! \# N1 x  _
                printf("No effective message!\n");
1 L# g4 \" I3 [/ @# k1 g        }0 L# O+ k, p; U* |* W# r
}# ?& n4 Y% ]; J! C. F  Y* t
% _- ?% M- l2 S4 ?# |
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???, h; K6 r( A4 e1 n

: `  B* Y5 W9 i! T" H8 q. ]
$ w$ L; }, d' r8 i- s! W$ W) j5 s9 H# \: W9 ~1 V( G
4 S3 _/ h. P' m% f
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 10:37 , Processed in 0.036998 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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