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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑   d( J+ B( ^9 B' U

0 g3 B2 {, K0 e: Y. EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 F; I$ l% e6 |/ }" }#include <unistd.h>% g6 C. @: x3 T% p! h) Q
#include <sys/mman.h>
& g' D1 S7 L% Q8 c+ o8 U* I#include <sys/types.h>: E! K/ b8 G1 t% c3 v' {
#include <fcntl.h>
% j7 p7 E& Q: h/ Y7 \/ G- A% b4 E
0 s4 g: r! n& M" o0 q6 g: e/ M#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 R& r, J0 r( O1 q2 b5 q7 k+ D. b: K
2 \( q2 Q0 s5 o& Q" Etypedef struct+ Q! L+ I4 N; O8 P$ P' D' t+ E
{" Z( P: T- y: x; c: N* Z
        unsigned int a;
9 D& ~! G/ U& b( E$ \- @' f        unsigned int b;1 ?. {; x. ?6 v. m  X
        unsigned int packet_cout;- f- B+ T, W$ w: m4 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 y# [6 K" y' _+ \/ m, U

9 H5 m5 I) b2 K  \void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 c" Y3 @: }  B3 k3 Punsigned int count_copy = 0;# _1 e+ B, A2 U7 f
) J" f) }" ?$ V' ]8 E/ p# p
4 @; b' p5 N3 J+ @2 _9 b
int main()
9 D) l; m* y- E: g1 D* u+ K2 R{
2 q( ?  d  p, {7 P+ g/ g. W        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 \9 C7 @# p: f$ n. p9 k" L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;/ t  g7 L+ r) u5 b

3 C/ v1 E1 X) H6 O0 B        while(1)
$ |% f8 x; @% M: {' f* X. b        {1 K& E) S6 a7 c
                read_MSG_buffer(pshreRAM);
" a* o/ j$ U. B! L        }                  k3 ?0 f0 y) x$ n2 j  _- p
}
/ k+ @: N* u  g6 E) U' r
: l& h" P' ?6 B- h3 h! c7 E. pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 w5 d' d9 |9 s
{! g: j+ J( U3 J: x0 c
        RX_MSG_PROTOCOL buf;6 W& r$ b% ]7 o( j, x( @
        
/ F4 ~* {- C: P. ^# h* n" V        buf.a = pshreRAM->a;
3 _8 A0 Z. V6 c  K) i( m        buf.b = pshreRAM->b;
. ?4 {! c/ g; @( ]        buf.packet_cout = pshreRAM->packet_cout;
# f: N; S  ]# z        3 @0 O6 T$ o$ V
        if(buf.packet_cout != count_copy)) w: t. `; C7 o( z) q+ S
        {
; J$ ^7 W- p9 l. }: J( W! J                printf("a is %d\n", buf.a);' J5 o6 S( {0 _0 g4 v0 x3 `/ M( i
                printf("b is %d\n", buf.b);
6 i, q2 E0 \: J; U0 G/ E5 w                printf("count is %d\n", buf.packet_cout);9 O+ I/ R6 q) {3 [* Y2 @' O
                count_copy = buf.packet_cout;1 J$ c+ r1 a9 f6 ~$ v: t+ C# X. e! }
        }# x1 U4 P/ H" h8 s4 x( q7 ~
        else
, j% Q6 Z5 \9 |4 g$ X3 m( O        {  z+ M1 X. V4 F5 x
                printf("No effective message!");
- ?# D3 F! W) C        }& l# ?7 d8 k; T
}
) {; u7 s. o! _$ D1 g( V5 K  B: E0 I# l5 |' ?$ ^
5 P# m- p4 E' V" ?9 _+ ~9 |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。4 X( _& s. F1 q1 j& p
使用下面代码,对内存使用了mmap函数后:
0 c( W( Q/ |- \6 \+ U" j: k#include <stdio.h>
% g+ X0 G; J, V- ~#include <unistd.h>
9 H& l9 r9 i4 @#include <sys/mman.h>
1 z8 |/ ?# D4 x. h! }- z/ Z#include <sys/types.h>
3 b7 f( ~9 }# v6 F- E" F) n2 l$ [#include <fcntl.h>
2 c  [8 A) K1 j3 I8 Q! z0 p, {7 d" I' T, e9 L
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 R" [. \2 O' H. l# k7 V. u" d" {
#define SHAER_RAM_SIZE         (0x20000)   
9 `0 E" B- M6 s) s, ~0 A( m' G! z6 R2 ]9 x( q1 N% Z; w) D
typedef struct  ^. \! e9 o$ P1 \$ n5 I
{
4 C" {3 c' Q# ?: k        unsigned int a;1 p# b" U8 ~8 V1 l
        unsigned int b;' m6 x7 _  a$ p% J( i2 e( h
        unsigned int packet_cout;' S' B# S7 z1 t1 ~* ~" c7 A
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 Y& c8 `* d6 D) ^# O7 c+ C
. ~, C3 L; U9 ]
void read_MSG_buffer(int *baseaddr);
8 x8 F+ r4 p7 O% O7 tunsigned int count_copy = 0;
( i' s' ?# `7 `" c8 T8 Z- R  Q! u3 z$ q9 x7 Q$ c% F6 p
int main()
/ H8 b6 n1 N3 f/ f4 }{
# s# `0 C4 A% }9 f( W        int fd;
+ [# {; a9 L$ o3 u        int *mem = NULL;
3 D) K' e5 Z) q! d: p) P
, t* q3 w4 g' i        if((fd = open("/dev/mem", O_RDWR)) <0)
0 E0 i  E! I+ f) B8 [6 |+ n) T        {
) O) E7 h/ F* V6 U9 K! f1 U                perror("open error");9 j% c: ?$ m7 @2 |; f$ I% p
                return -1;& B: y6 N8 ^2 E1 _
        }
1 j- d1 n  J  D" e9 L/ _, O        : R: I" F  D; X5 V2 Y. m4 v
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- q) k7 L( g; \& |* n
% U. Y, y; m! d0 b% ~( A        while(1)
- Z! ^1 ?8 ~0 y# q        {4 R" ~" T4 x% {/ r
                read_MSG_buffer(mem);
2 Z! N4 C4 x# `- q, r        }                + c6 ?. f, F; V, y
}0 d" ~- x6 j8 c# L- m

8 t) v5 H8 _. v* a/ z1 tvoid read_MSG_buffer(int *baseaddr)
1 B5 `7 u  n- v  A8 W2 A{+ p( l# L* R! N" U7 y7 M
        pRX_MSG_PROTOCOL pshreRAM = NULL;  b4 ]  Q8 {7 u9 w4 b+ r
/ F5 ~/ S- M% D& ~0 v* I; c- t
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( O2 {, K" D/ F( ]
  Z' f1 H9 M) K1 a( e$ W
        if(pshreRAM->packet_cout != count_copy)
+ G, E- H0 S' f: J, p' h7 P' x        {5 H: s: H1 W) F8 a4 ?- O7 d
                printf("a is %d\n", pshreRAM->a);3 X$ `$ p6 C+ c: E3 _/ i1 X( D
                printf("b is %d\n", pshreRAM->b);
# Z# c" W/ q+ f$ [. g4 V& q                printf("count is %d\n", pshreRAM->packet_cout);( l4 u7 j! P4 Z
                count_copy = pshreRAM->packet_cout;; N3 E' W8 i' N( C
        }
* n3 Y- j, D* f        else6 h5 {; t# B; \* D6 N8 Z% v
        {
% v9 ?8 P3 @, e! \                printf("No effective message!\n");
* o3 H  Q# V8 a# V+ _        }
4 Z5 H; D4 {4 ^( v}
1 T- P! c2 g5 L: O/ ]' R$ ]; v
% |+ g. ^8 f$ V6 L0 _+ ~' Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) [7 t5 y$ w& L) K* {5 w2 W

4 L5 m2 X, g7 t0 z4 |* M2 C5 _/ g3 c3 d

2 {& R: ?: _7 F; {4 k4 H1 B1 @! s( C- r( `( U% u! ^% G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-4 12:40 , Processed in 0.037190 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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