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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' j2 {& Z% G/ [, w) p7 T# L
: L1 J, X$ z0 c; t1 m4 a- }$ Z4 V9 |
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: [1 h' l* N7 ~, e7 u6 \, Q* X
#include <unistd.h>
7 c) `( e* f! ^; E* ~# I#include <sys/mman.h>
; ]  n$ U! `1 I& L8 N#include <sys/types.h>+ o+ e3 }+ g% g3 e2 ~  K' F! L, \
#include <fcntl.h>
2 M, f9 O/ @" y# A; Q% b9 B2 ?8 r- h& [, H  F8 P/ Y& [# ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)     [/ n4 D4 X* I, |* r. R: P( `
& e- w$ n  Y0 J* b" u& E- c: W' l
typedef struct$ q/ P. L# d, K, j7 ?' n- A* s  j6 m  j9 T
{
3 L' N# T( J% N* `$ o. M        unsigned int a;4 C4 q2 D7 z, J
        unsigned int b;
6 m7 b& R! X0 G3 _' l( K0 l8 `/ I. P        unsigned int packet_cout;% }4 H8 }( W6 C, |  b* O/ n5 y- n* b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ p# l! _' z" L0 L6 V( s
( s, E* ^, i5 o2 a  @; z9 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) C0 T/ r9 b5 |/ x$ r6 Vunsigned int count_copy = 0;1 p, N+ l/ k% S3 u9 X& h! C
) B0 y. |" z5 C3 H
& G# p6 K8 L  W" r( ~& P& N8 L/ _$ k
int main()
1 Z$ d/ z4 @7 s{
" }# ^; b7 X# G- w5 |        pRX_MSG_PROTOCOL pshreRAM = NULL;
. y' Z4 _6 q6 F% Q6 I        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ h+ n1 Z( R( V# G% t, e9 \  h3 W( ~6 m0 \6 W
        while(1)
: K" ?% i: T1 G1 R/ D/ o        {+ `/ h" z* _  v
                read_MSG_buffer(pshreRAM);: B. m9 w6 P; S
        }                8 S* e0 j* S5 f; e9 X2 I
}
" |4 I8 L: c- h: C) D; M5 j
8 w6 y! U; n+ Y9 X! kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( g' o( I0 z4 T* C5 @
{
, l7 [: @( Y0 K1 l( T, h+ ]        RX_MSG_PROTOCOL buf;5 x, X4 Y: R5 u
        + T& i, K& I8 V+ a; q# T
        buf.a = pshreRAM->a;
, v0 `/ u) q4 K" ^/ b        buf.b = pshreRAM->b;
3 K' `3 x5 E1 K& q/ U; _' c        buf.packet_cout = pshreRAM->packet_cout;- K: `# c7 A4 P7 W6 L+ ?
        
1 H0 f" V& i: `+ X        if(buf.packet_cout != count_copy)& {7 Q% U' h8 c
        {1 R; P- b, p2 o* [
                printf("a is %d\n", buf.a);
* m) T) [+ }3 W3 }6 O. j                printf("b is %d\n", buf.b);- C1 y" [+ w% F
                printf("count is %d\n", buf.packet_cout);
% y& g* d1 g5 o/ r2 U! o3 g                count_copy = buf.packet_cout;$ E( Z: K% D# {3 h7 [0 l% ?
        }
9 U; W, }7 _& {        else
8 U$ ^* _9 V: j4 s5 }$ x        {
& ?1 i) i1 ?0 f' f& N* J. G1 A3 s1 m                printf("No effective message!");: ^$ {) S/ K& n+ I! P
        }
% h- D- v+ M( w}
' }$ |6 j  `3 g5 V, S) o+ [. t, I1 d' z( I

- P% o6 A2 R2 a2 C0 v* f5 q$ a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。$ ~4 k6 ~9 \& S" S
使用下面代码,对内存使用了mmap函数后:* x/ I' t( k- x% I9 T- x
#include <stdio.h>
0 ]  z# \, m1 M" P( k, h4 N* m#include <unistd.h>
+ r0 P$ }1 j4 S#include <sys/mman.h>/ `3 i8 E9 J. e( `. \  h5 U* Q- s
#include <sys/types.h>
7 I( ?5 E& Q+ g5 V% n1 m' e#include <fcntl.h>) f& U& g- d; N) _' j  D9 q) Y

+ A8 z6 Q- n2 ?5 I' e#define SHAER_RAM_BASE_ADDR    (0x80000000)5 c( t* [6 B, o% u4 P* i- k" t) N
#define SHAER_RAM_SIZE         (0x20000)     i3 {5 t2 i- _% V( e

) S- k) c0 B! c/ y: A& Stypedef struct) o4 Y* w3 M$ F0 s
{) g) W/ ]  y! Y! u- t1 s) D* Y
        unsigned int a;7 ?6 r% @2 R9 J- \' `9 e
        unsigned int b;
9 h1 r; |$ c+ |3 q. w, E        unsigned int packet_cout;
4 v" p$ R& O. {5 j" Z4 o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' l1 @1 n4 u2 I# X, N/ r  E  s2 h
) W9 E' t4 Q: ]7 Jvoid read_MSG_buffer(int *baseaddr);* E* I4 P, d1 K
unsigned int count_copy = 0;
% a9 ^# U  E9 \$ ]/ z/ c- W& h) w
$ G; I0 S9 q4 ]( u$ qint main()
1 V9 S9 i* i, |7 I& s. p2 _; f9 X{0 i+ d) n1 |- e, |' Z
        int fd;
# r0 n* ^/ i, m! E% P0 t        int *mem = NULL;
, \# X3 o: B( `7 W1 b- a) Q
: }+ E4 d. o! ?& ?% H2 ^" D        if((fd = open("/dev/mem", O_RDWR)) <0)" S3 _6 {8 N. I/ N' J
        {. i/ K; ?" Q: j3 d5 W
                perror("open error");7 A( ~! S4 I0 a: F1 P
                return -1;
" Z8 [# o6 V- J- V, s: S- t" @        }( H1 C4 R* M3 N7 v3 h
        : Z( P1 {* O( |7 r+ b" E8 o! u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" m' u/ [: ]8 Y$ H/ n

9 i2 _' B" ]. o0 T6 L        while(1)& _4 K0 r2 u) M- V! h5 K
        {% o: [" r; J- ]
                read_MSG_buffer(mem);4 b. M1 k  l) `& l6 ~8 c2 R
        }               
( q4 Z" Q: i& r1 {! A$ k  ~, [}
1 l! m. q+ z  `) X! l  W3 I! d0 V) o/ d$ x
void read_MSG_buffer(int *baseaddr)
+ S6 {2 {0 t8 U6 @. z{( O/ N& o% H7 E/ G' `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ }7 K; n# |$ O8 z$ ?+ n
+ X2 ]' \1 A2 X4 X" H5 n1 B$ H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; U+ P: p! H# m! @9 {1 l
& }2 z4 O$ T2 m# R3 z7 \6 H
        if(pshreRAM->packet_cout != count_copy)! Q+ d9 t( d' |- K* D  d. r7 J- Q
        {8 z" d, r& z+ T' L
                printf("a is %d\n", pshreRAM->a);+ ^/ H, [7 d3 G+ q" B( Q
                printf("b is %d\n", pshreRAM->b);
: O$ _. N$ \! f. u                printf("count is %d\n", pshreRAM->packet_cout);
+ F! p; Z$ B3 o) G                count_copy = pshreRAM->packet_cout;) F2 {6 d- ~4 z' J5 X
        }
  K( u- C0 i7 n8 {  H        else0 _$ K) f9 h+ H5 B' u+ _- `4 X
        {" x# v& Z: c. ?, g
                printf("No effective message!\n");% f1 z, k' j+ C
        }
5 f, u, Y/ Z; H7 T) {1 J}
% p) ~/ v2 N+ d  D/ ?- t8 E& ]. S
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 Z" O- n1 {7 L% W2 j( }
) u( Y; t4 Y/ s
% o# S: l) U5 t# H( g7 P; K3 V! u; S& A8 o2 o6 \- f* K! R
" N/ U: w8 y( U" E: t- d4 v. G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 09:28 , Processed in 0.040316 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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