OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 t! O  {5 Y1 }" F1 z
9 h1 b9 e4 f) _7 HOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- u% h! }: ]) r2 U! _; p
#include <unistd.h>' }0 D5 r2 T6 C* c4 e
#include <sys/mman.h>
$ y/ q' _4 E, A9 X( b#include <sys/types.h>
4 |7 G2 C- {. i9 X  G' k6 ~#include <fcntl.h>
& }  t: T+ l" F$ b6 T, U& t* }$ b  A. E
#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 l5 b* k) b, D6 M1 W

! _1 Y2 [& F2 W9 c4 w1 }% H  itypedef struct% S5 u9 e6 L! A; Y
{# a) Z- L+ F0 F; I) P4 d
        unsigned int a;
& D. y1 P) V; Z1 Z+ J& ]0 C        unsigned int b;
/ V# `; p) v( c+ v9 W4 z9 P- v9 B8 L        unsigned int packet_cout;' W, V; a' a" p/ s# j1 K: F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) Z9 ^5 x8 n* r9 i6 O& D
& @5 {, F9 `9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) d. F! e' N" ~$ N& X0 Uunsigned int count_copy = 0;5 Y' D% I0 F# }+ I: D

- a1 s8 C2 f: ?( Y* [2 a
% A- K. F4 J1 }8 A4 B+ U- n: qint main()2 H$ k, I8 ]2 A9 h8 O/ k' |8 D# a
{7 e' t/ S) D( N+ _- W' ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;: x: n( s- B6 ?" V" @" B. {2 v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 M+ L* l" A) b/ `' c: |. y+ f
1 o7 l/ C% F5 L+ _" Z: D+ l7 D        while(1)
+ A% @! M* q  ]) z. M        {/ y/ g6 v* k  g: o: H$ @6 z% ^8 l
                read_MSG_buffer(pshreRAM);% E3 _& X" f8 T7 M6 A
        }                # K- |) n3 J0 S0 k6 N, C
}+ F2 U3 b" S# [& B' V! L1 S! Q( Z

8 G! m/ r$ ^) U) _& g3 d7 K5 C  |* Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)2 h4 W0 C" {% X8 F4 a4 f
{
8 b: b- @- Z: n* @% T1 b5 S9 L& l+ ~        RX_MSG_PROTOCOL buf;
8 q& s& }+ y. }        
) y. ?6 d- J+ ?2 G( f! h- z0 \        buf.a = pshreRAM->a;
" |* q+ d% n( U, N: s        buf.b = pshreRAM->b;! D0 L7 \- {, h7 e9 ~7 E! H' `: ~
        buf.packet_cout = pshreRAM->packet_cout;+ U! ?; |+ y- k( ]9 A9 v0 w+ {; c
        0 ^% A! t9 e) J8 Y8 A6 |
        if(buf.packet_cout != count_copy)  R( ?' g6 N5 c- P7 s1 u
        {
9 [  R; D) ~- g. i. a' g, x                printf("a is %d\n", buf.a);9 j- R$ X, x% X" [  m9 G5 Q5 U
                printf("b is %d\n", buf.b);
! ~5 I! h  A5 b+ |                printf("count is %d\n", buf.packet_cout);
6 f7 u/ s/ ^3 Z9 |                count_copy = buf.packet_cout;
# i) s. {3 |  V$ u        }+ t; v' R0 b0 \. d5 m2 F
        else
" l4 Q2 T0 u' ^# e% W: T) T8 a( D2 v        {, _( S; s: r$ H6 d( I
                printf("No effective message!");
& E+ g3 F' Y1 `( Z        }# E$ b* l: t( U
}* g0 e1 [) [: ]! t; r

; b/ y2 a$ s& d$ I, g: q/ A# K7 V8 k9 f- X0 ^; E) w3 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
4 c, E& f( _6 O8 O使用下面代码,对内存使用了mmap函数后:
8 `- _# x  a3 w#include <stdio.h>
6 A3 l! G1 I1 C, B9 D8 c  K- x' D#include <unistd.h>  m- F: v0 y4 ~. f, p3 O! u
#include <sys/mman.h>
* E$ L* u' E4 l% R9 T5 s#include <sys/types.h>, {4 o) E7 J' |  Y# G4 s4 \
#include <fcntl.h>7 ?- a( G9 E! R$ U4 ]6 l
$ `7 x8 C9 f, R& U0 [2 p( F  h
#define SHAER_RAM_BASE_ADDR    (0x80000000); Q- P, V- o, A9 U1 m5 R6 `2 v
#define SHAER_RAM_SIZE         (0x20000)   
' C3 s$ ]( h" y7 ^7 ?
. t: W+ r2 f  {0 U5 Xtypedef struct
+ }' L( ~" b& n{
* j" b( x' x7 z9 ]        unsigned int a;" _; p& G+ E5 A. f; \
        unsigned int b;
6 y: l! r& R8 u% X! x        unsigned int packet_cout;
% p6 G6 @7 r) f/ ?. O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% X7 z- k2 f' l. i% L* s
* H3 s# G5 o2 nvoid read_MSG_buffer(int *baseaddr);
5 J1 ]0 u, j$ v  Aunsigned int count_copy = 0;$ O! `9 F% P8 X3 U# R) g

' r2 a! _- i. V6 C- ^" |0 o# Tint main()0 ]( l. B8 C1 V; Q$ K
{
- J" B- g: e9 E" L$ l0 i/ C        int fd;0 l* `1 u. B3 o5 c
        int *mem = NULL;
6 U# n0 a, t2 U' U
+ l! }5 e4 B5 D: ~% S! m% a        if((fd = open("/dev/mem", O_RDWR)) <0)( [4 |, Z% F; X' g
        {
1 K/ Q% R5 N3 A( w/ y, z2 R                perror("open error");
+ ~3 u% @& j% H# m! [. Y& c                return -1;
3 v6 u) f* {2 I- t        }
; F* E/ f5 ?) h, d9 R6 R# T2 u        # m# q# n& e; X/ @& s
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: {* K3 T, o) R9 M1 q3 J4 \; l. F( E" W
        while(1)3 k! c" l/ n: Z5 O; i
        {1 k4 o' C, f/ a: k2 A
                read_MSG_buffer(mem);. A5 v4 t7 t3 I% |
        }               
+ y1 d* g8 Y2 M* j}
7 N. }5 c  c, o5 M4 }# W1 z0 ?6 B$ V0 H4 |
void read_MSG_buffer(int *baseaddr)! Z# u, z0 v5 e" x
{' N1 p' B% q' w: H
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 J. i# e( g" y! Y
6 q4 |5 F: K$ t6 U' |4 I5 b2 t, s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) o& X3 h. k' I2 [# e- t& E" H

) b; _; {. m; L        if(pshreRAM->packet_cout != count_copy)0 k. K; `2 q" Q1 J5 _
        {
* u) @9 w! s+ M7 ^$ }/ Z/ d, s1 Q                printf("a is %d\n", pshreRAM->a);, }8 F. `# ^2 t, p- i
                printf("b is %d\n", pshreRAM->b);
3 l- ~+ E6 q  B9 m                printf("count is %d\n", pshreRAM->packet_cout);) O. G# Y' |5 M- X- m7 Z
                count_copy = pshreRAM->packet_cout;
! y3 @8 k) ~6 J& m        }
+ K* i1 Y8 Z' C, Y& n- {        else4 v' H- e' n0 j: c) u. P
        {% q5 W* P+ b. g/ D
                printf("No effective message!\n");
, Z9 n( c+ Y6 i        }: V' q  W5 @  [: H  U, d
}
: w0 t# O; [$ d. ~( h# e9 y( R# b" H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( k/ ]3 o: V1 l- W7 B

: T. L3 E$ M. G. B9 A7 h
9 y1 d6 J/ Q4 s' d# S8 r. G2 l& K9 W9 J
1 e, ]/ f8 q  u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-11 18:14 , Processed in 0.040664 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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