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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 w9 d* N) V- A# c

: P' C* q, ^' [& _$ j% YOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ ]& }6 h9 Q" b8 M& y#include <unistd.h>! @  L- s4 g/ h
#include <sys/mman.h>
( m6 c% M, a1 ?$ R! \5 R#include <sys/types.h>
7 B# l( @/ R$ D& k9 t6 |  ?#include <fcntl.h>
( R; l$ l; d+ }$ o6 p, I9 c9 h9 k: Q4 s3 M% R5 R9 @: X5 f, G
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; [* z2 i+ D* S% S3 E: Z

/ Y3 j& l" `4 j  l, Ftypedef struct2 _  i" r+ ]( q5 G$ x% L( }
{
$ @( M" B, h1 t6 h7 t        unsigned int a;6 V5 Z) {6 v" [, Q+ a3 U* u" Z
        unsigned int b;
' B6 ^4 C; E& ]$ ~        unsigned int packet_cout;
  Y0 Q* Z" T- {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  H& l9 B! ]6 V- `/ _4 G
5 u- f# B7 i5 [# _/ K" K5 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, H$ n9 L+ S" f2 S) a$ R! gunsigned int count_copy = 0;
/ y1 E- W. D$ S) \4 [9 g/ ?) \/ D* P

5 L% ^3 c2 n4 _" H* D4 Oint main()9 f$ ]0 O6 W: `( Y7 c
{5 ?6 e2 y8 Y; d
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( S! E" N) k) w( t' e) Y9 e        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 C! |' q) W$ ]5 U) O$ j# Y
  Q- t. ~, t; n, }& i% I        while(1): s" P. R1 C, r# n- w0 H: d
        {
( g+ x; E) e" o* g                read_MSG_buffer(pshreRAM);
! ?( I7 g4 Z( e: p! r7 A- R        }                  i$ U7 r3 W" p% ?. ^
}+ W+ s5 k+ G- M* Y% [
+ Y4 u1 x0 c, ]' \/ g5 W, b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- C8 k: H& d' `& h* L8 J
{
/ \+ R6 b* ~4 _* N        RX_MSG_PROTOCOL buf;
4 b) L8 g- }8 H        
, |, }( E6 b$ J5 M/ m# F        buf.a = pshreRAM->a;& i, C2 e$ d+ F6 \  k1 d( w& A
        buf.b = pshreRAM->b;' T1 F/ z: A. B
        buf.packet_cout = pshreRAM->packet_cout;& e- f: Z. f9 e6 n5 W: {
        
3 G0 @6 j$ V/ z* ~% [0 l        if(buf.packet_cout != count_copy)9 S* M- @/ q2 W5 B( z
        {
' ]9 ~6 ?" K% v; b1 G% ~                printf("a is %d\n", buf.a);  j" ]7 Y% y7 m. h8 C
                printf("b is %d\n", buf.b);8 x0 ?' T* Y/ S( n% x  d2 _
                printf("count is %d\n", buf.packet_cout);( D3 Y0 k$ \2 ^
                count_copy = buf.packet_cout;% j; v" K1 w2 l/ k) \0 S; i  L
        }6 ~/ P6 h! l$ u4 b) H* B5 B9 Q
        else
- R8 q& l, @; n: u4 [' ]$ a        {, |) k7 W, k- [! i
                printf("No effective message!");
4 ~' h8 i1 I8 h. S# R" c        }& s  d7 }! u5 X  T& m
}
% ], |7 k3 X( `; s1 E" l7 U4 C0 i3 x& U& h. q

1 j8 V6 q+ k3 D! \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& I  r2 q, |4 A* z& f使用下面代码,对内存使用了mmap函数后:6 P0 \7 @- M5 g4 n  ^/ J
#include <stdio.h>& H5 e* M# e4 \! X
#include <unistd.h>+ D- {, D0 a9 c6 e5 i/ @
#include <sys/mman.h>8 c* V4 R$ x  b3 D. c  P- n# y
#include <sys/types.h>
! d0 m6 j" H& X8 ^& Y7 m+ P#include <fcntl.h>
4 ]6 W  _* o- c9 R& c7 C, z
. {7 \! f- W  u#define SHAER_RAM_BASE_ADDR    (0x80000000); ~5 y" @7 ]' q  ~6 i! w3 S) L
#define SHAER_RAM_SIZE         (0x20000)   
  i$ q6 F6 ~3 x, [1 @) E
9 o% K7 ]0 B, \# Atypedef struct
- O$ i9 X3 m. ?# `! p6 }# h{
3 l" P$ c2 A$ E$ v1 \: R        unsigned int a;; g' T9 X$ N4 j5 m
        unsigned int b;5 ]% q2 g% E+ R" k- J7 {4 g
        unsigned int packet_cout;+ n7 Y, Y7 S/ p6 Z4 h; V7 M
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. @) s: \  e( f; I6 @5 z; l1 @! W
, z! F* H) X/ C5 G
void read_MSG_buffer(int *baseaddr);; i6 }* l4 B( z# M% g$ Z
unsigned int count_copy = 0;
; g( X2 d6 R1 \& K/ T# m! N) E) R# }4 f% i$ n) k" @
int main()4 c1 s7 D+ h( j  H0 ~1 v0 U
{
& r9 q, q) [: h1 ^& m( r) I        int fd;
1 l# o* p8 e4 p; G: @* @* O2 J% {9 i        int *mem = NULL;' c; `) u9 m" t9 Y& k
) Y6 Y/ P) r& G5 p3 G
        if((fd = open("/dev/mem", O_RDWR)) <0)6 [5 c& T, Q; G$ O
        {
$ u  t$ h6 u3 I3 _! n! ]                perror("open error");
( U3 `4 [9 y! l# c- Q7 q0 S" |' N& ~                return -1;
: q/ r" k+ W' A2 J6 P        }7 Y/ ~' x6 e, X, g
        
' t# g6 Q2 F1 V' _        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 `2 V; j5 t. n/ I% v% X, X
" o$ K8 X1 l$ s+ r; Z* g; j( R        while(1)5 P, j& _( d: v' s
        {8 Z! F# C6 N" |; l. i8 L
                read_MSG_buffer(mem);/ n5 Z, M2 F+ l8 H
        }                * b6 I+ W9 m8 n4 [; R
}
5 \6 e" X" E8 P# F
) v4 p* b) F- F* R: c! {void read_MSG_buffer(int *baseaddr)
3 p/ P3 ]( Q/ T& Y' u* H' W{7 P' H0 Z, p" Q. t6 J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
' O8 F' j! L( ?7 F" _& w: ~4 a- n+ g5 q$ W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 B) K/ ~' r# G  ]; J+ F8 w6 h# n) s: N& ~, q5 m0 G
        if(pshreRAM->packet_cout != count_copy)# R7 V; _3 d/ e1 m- f- M
        {
: ~9 z' t8 k: K1 p4 ~$ _3 K                printf("a is %d\n", pshreRAM->a);/ ?# j6 }5 g( Y. N
                printf("b is %d\n", pshreRAM->b);4 n$ m. o, Q! @2 W+ C
                printf("count is %d\n", pshreRAM->packet_cout);9 B# m1 S5 k$ T& |: b9 E
                count_copy = pshreRAM->packet_cout;
: \+ A" c( U) y: x" \        }: O% \. _0 V4 l; r. P$ Z7 T
        else
. w6 n4 @, b! w3 i        {
4 r8 p3 m1 ^9 W# _  `( |% b1 t/ F                printf("No effective message!\n");, a% ^% S- B; H$ e. _( K
        }
8 `2 N# H) w! M  c0 f}
8 R$ X) l9 J# B0 f7 ~7 K) ]. \, ~. s4 ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) q$ j2 j! X2 P$ a2 P+ }9 {0 T. N5 W7 g& W
. \" Y8 l# n8 G) S
* b5 o! o, ?' V' d2 d0 W8 ~

2 A) M( s6 {- w5 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 14:41 , Processed in 0.037852 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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