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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 s% \  h( ~5 o+ E" N

* y$ p5 {" S1 N7 q, Q5 r* C9 {  JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* x# M. B2 G3 b: v% p$ ^" |/ a
#include <unistd.h>
! w0 l  I# k) N) x6 e6 c/ b+ [#include <sys/mman.h>% ~! V; B% c8 l$ c. C9 n
#include <sys/types.h>  C, \* c: P7 E
#include <fcntl.h>
2 @5 T: E' ?  L* Z
% q4 i: ~% s, G2 Y# M5 L$ d#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% x9 n1 `: c1 `, ^" K( @! x3 o8 J1 q8 p! k( E9 d$ ]- n, ^: |
typedef struct3 J8 g, R( {9 d/ U3 d$ M
{
1 r! F( Q4 b& A5 r7 `        unsigned int a;/ D/ H' Z# s4 o- X$ W$ Y* `" ]0 J
        unsigned int b;
' N5 x4 E/ C4 ~: o$ {4 \' H        unsigned int packet_cout;( y7 q1 M  i- I8 X# K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. I/ n! p4 P1 ?/ _7 O  ]  r5 X. F- L2 w2 c" p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 _  F8 f; [6 P: b7 K" D
unsigned int count_copy = 0;
; W- ^1 X' u- p" }( E8 ^8 n/ y
9 n# L& n3 _, s1 s
/ ?/ C* S" |7 [int main()* y! J; ~& `  @7 b8 i0 z
{2 |7 `5 A1 d& Z$ [2 [
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 R+ h- J+ c  q* ~% f/ K7 z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  L7 k: }& Y$ G) p

5 i! m$ P# `4 r& }: M        while(1)# K2 P! X' c% ^* k. E9 d
        {
* p, h& @/ P* t/ ~# x                read_MSG_buffer(pshreRAM);
$ v% i& S4 b7 W        }               
# z, Y. p3 W; }$ ?9 V6 T}- L3 T( C3 H6 J5 R2 d
, D! Y+ m  X4 u2 D+ w2 L" ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 q* a4 F' w  y/ S& s5 g
{
8 A7 ~3 p; |- F/ r, j        RX_MSG_PROTOCOL buf;# p7 A! y! \; t& l5 F1 Z8 y8 F/ j
        
7 X1 D' R4 K* x, N: k0 L9 X- r        buf.a = pshreRAM->a;
2 p( _, A# M4 f& c        buf.b = pshreRAM->b;* b; v- V4 `0 c; @7 v2 c! m/ a; t
        buf.packet_cout = pshreRAM->packet_cout;
; q, b5 [, e8 h  ]9 J6 F        
1 s1 p, B) g: ^        if(buf.packet_cout != count_copy)) @2 V" t% \9 F' t, n( g6 V2 X  p
        {% \, b0 i- X! l& C7 @- h
                printf("a is %d\n", buf.a);; f' s) w. S/ y
                printf("b is %d\n", buf.b);9 l; f3 z* a' X! j9 ~  b9 J
                printf("count is %d\n", buf.packet_cout);
3 P3 ]: {3 J! @: t                count_copy = buf.packet_cout;1 m$ D8 e8 ?' Q1 `2 l' a7 b
        }$ c, e. I+ A  Z% Q6 {! L* `. ?$ @
        else; n# a8 t) r9 f% j* y4 b& A
        {4 M6 n( Z& a9 q# z; C
                printf("No effective message!");. g; d8 i; A! j; _5 |0 Y+ w
        }
) z  g5 Q# d! h1 I}
7 L5 C. w$ Z, {: M9 t; r
. V$ u2 B# }8 s4 ?8 C  }6 Y& a
. C- |& l: E* e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 U' s: u; n" F- A+ y6 P
使用下面代码,对内存使用了mmap函数后:' V4 P' f' _, v  i( f5 `
#include <stdio.h>
0 [& M' ~2 _1 [#include <unistd.h>+ V+ {3 _. S8 _9 [, o1 {( m" [
#include <sys/mman.h>
% g$ m3 W5 M% N#include <sys/types.h>
; U3 u( @, I* c1 ]( r#include <fcntl.h>" m' W6 p1 o0 Y+ v) L
" {, e& J8 @4 x5 G3 R
#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 W4 `( Z, A. Q- [& i#define SHAER_RAM_SIZE         (0x20000)   2 X# Z+ N4 @  j0 |4 i! i2 R

. O- d' v6 J3 Y( c& j# t6 c1 dtypedef struct
8 t) l; o9 @0 B- `6 P{
  j: _) g6 J/ y  @: |' V        unsigned int a;
$ o! W" c; l8 e        unsigned int b;, z- M  R0 W1 _; D7 Z# I
        unsigned int packet_cout;5 A, e  X( T5 `2 t* l+ K6 v; x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, M: h# }# L  O$ R4 z( B3 d& g, F2 q4 |0 R( y( c" Y  |) V
void read_MSG_buffer(int *baseaddr);: L) P% [( P! E( Y9 g# U
unsigned int count_copy = 0;
- _" A6 |9 T. a% z8 [% u- ]
( ~. U7 m: A; o2 Lint main()
  L0 ?6 H1 O0 v6 p{
& {; i8 V; A  o- l& |+ J1 C        int fd;
( e  d9 v- e: `- [, I        int *mem = NULL;6 `* ?" ]" ?' a

3 h2 y9 k& i% ^# Z        if((fd = open("/dev/mem", O_RDWR)) <0)
# E7 [4 U9 l, n: s1 J4 j% V        {4 t$ J8 {8 V; e& `
                perror("open error");
# G& @0 t( D( x5 ?9 I! F8 A. R                return -1;- t# d& s& q& z" i4 Y* ?, x6 r
        }! j0 D$ y" r- i. T
        
# Z: l% `" j' n6 J5 n. @9 e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# ?% i6 v5 p3 g$ _$ L& m
: q* A% G3 N% W+ b" G" J4 K( A
        while(1)
: i) F6 ^+ `0 L        {
2 a4 c% Q2 y( A8 g& W( v  M6 u                read_MSG_buffer(mem);
0 m. R6 Q/ I! C& ?        }                8 g- b% z. n; \  o7 E" h0 ?# l
}
) ^  p$ D# X% b
# U4 y: q& H  ^void read_MSG_buffer(int *baseaddr)
. Q! y+ _3 u; f7 ]/ e. _) g1 X! H{0 o7 `, h) A4 {1 g& M+ B
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 p/ w- u5 r6 z$ o2 n9 T, E3 |7 z

* s4 I5 @8 }  ]6 J        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  n4 ^. w: q1 E' I( y/ O# a
; u9 ?1 o' e  J+ J! Y, B3 g
        if(pshreRAM->packet_cout != count_copy)
8 H( G3 D% `. x6 h$ y) l0 }        {0 ~* T/ T/ W7 [
                printf("a is %d\n", pshreRAM->a);! U$ e$ Y) Z9 r# Q+ B( Q' f, h
                printf("b is %d\n", pshreRAM->b);3 y$ ]8 Z& j0 ~6 v8 t% v4 g! `* ~; Q
                printf("count is %d\n", pshreRAM->packet_cout);2 _6 m# O5 b1 ]6 A  S9 m/ a
                count_copy = pshreRAM->packet_cout;0 \& M9 a- ]5 {  m. v7 _: x) L
        }( d, z, e9 j+ T  Z* V1 Z; A% i
        else0 a9 R  }- D1 Y4 \$ w6 T
        {
1 A5 c0 o- |, V, E$ |9 c& ~                printf("No effective message!\n");
1 O5 o4 u* h* k$ D9 t. K        }, H$ \3 h  |" X; b* \
}
) \  x+ ?7 ?! |( T1 @% [: p, `
7 F6 v0 e  G8 `- ~7 r& |5 d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
! v) ^( e3 h" i6 c1 n( l
+ ~0 I- m. O/ K5 W4 _
$ E% K7 V, h2 G- b; p8 r
- R0 f! x. Q$ M- X+ D; P( s2 q$ ^2 X! W& }0 T; L3 t# V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-4 14:36 , Processed in 0.042099 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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