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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 m+ y; e8 J& h% j: \
* M# E" U$ r( X) Q. n- sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 S; ?6 D' i! Y4 V; ^- c+ T
#include <unistd.h>
$ U$ B+ o( ?( M& w, m- g" C#include <sys/mman.h>
  j2 r- ~0 @5 B! r5 X#include <sys/types.h>5 l' R+ N- S* M  Y* F) f1 n" S: C
#include <fcntl.h>9 H5 k8 \. b* R

3 X4 ?7 G  s1 x  {/ a#define SHAER_RAM_BASE_ADDR    (0x80000000)   % c' r, h: m9 N) C3 U2 W

! V! T% j% k+ Otypedef struct
5 a+ k( v0 i( m4 S/ q9 V{9 |! L# b7 A0 Z& b* a' I. q, u) Y
        unsigned int a;
' f% @: M6 i" o& Q/ q  _1 c9 L        unsigned int b;
" s5 d: D" q, g& g        unsigned int packet_cout;
! H1 a  V9 H# Z5 P4 P4 a% Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" {5 g' N  y% Y0 f9 s+ T6 ?" \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 s4 m/ h( u2 C. O
unsigned int count_copy = 0;/ A% d, Y$ u1 D8 B! L! ]

& H; W6 Q/ S" y- Q. l- c1 o) e1 g- q' ~
int main()2 N" ~* t6 ~9 u% {7 x( q
{: P! e( |5 e$ o2 P
        pRX_MSG_PROTOCOL pshreRAM = NULL;) t% ~9 x# x% W7 I/ s
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 v& o% O3 b+ r9 `9 D: B
( q3 C1 Y8 S. Q8 R0 I
        while(1)  v6 F' E3 }2 K" M9 n# z
        {
5 e. X% K8 D- ?$ O& |; h7 e                read_MSG_buffer(pshreRAM);0 q& q+ K" a. l9 G* H. S4 G6 A
        }                % M/ H: n. `3 ]# ~* n+ Q& x. C5 A1 U
}$ o+ r* }0 ]; ?4 u
1 ^& |9 I4 q- n- p4 u& g/ x* s; W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) O8 e1 n+ F" C3 T{
$ H0 d0 k8 j0 D        RX_MSG_PROTOCOL buf;
% b% c6 f! a# F8 N6 ^! A6 @- a6 i) D        7 @. L2 ?) {, W0 x# h$ K9 y' Q
        buf.a = pshreRAM->a;$ v' C3 @) o: z" C: b3 [( K( j" w: O
        buf.b = pshreRAM->b;+ u2 {; l+ _# V% n" a+ e5 R
        buf.packet_cout = pshreRAM->packet_cout;% u5 f7 V3 Q; ^  O/ [! a% q" \
        8 @+ |3 J9 B/ {, X* K; l% W
        if(buf.packet_cout != count_copy)
% f" b7 }* @, q6 \( @1 \        {2 B8 V$ A. U; ~/ s1 w5 F0 W; Q8 G
                printf("a is %d\n", buf.a);
$ J* q- U* i6 N# [- `                printf("b is %d\n", buf.b);8 z& y: N% c. r$ K$ ^; j: B% V  ~3 h
                printf("count is %d\n", buf.packet_cout);8 w( U7 u; f1 h
                count_copy = buf.packet_cout;
- _# k; c+ _: i1 a  @0 e0 W% q4 q        }
2 Y. i0 j; I( s/ B        else3 x1 g9 \( V/ J/ ], F
        {
) b+ u( p' h' K- Y% q4 S                printf("No effective message!");4 i$ @- \. U' d0 w
        }
( x3 V, E- Q, x2 H}1 X  h0 V2 E% P& \

, ]1 c9 c6 D- \# c6 X$ t5 ~2 h: h$ f! E2 l/ Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) X0 H) p+ m! i' a
使用下面代码,对内存使用了mmap函数后:9 Q) \1 @2 z4 w% U. |% u! g- j0 n
#include <stdio.h>: o* d9 ?  U  G) h) Y
#include <unistd.h>" S& z' V/ H( N
#include <sys/mman.h>
, W) K1 ]0 H8 ^2 p#include <sys/types.h>
" t. l" R# `* L- x# d#include <fcntl.h>9 ?' ]" f4 m' D) }: `

. ?1 U% Z! F; A5 L9 s4 H! ~#define SHAER_RAM_BASE_ADDR    (0x80000000)' m# b4 A3 L6 o# V. L5 s5 ?. W
#define SHAER_RAM_SIZE         (0x20000)   : @7 u2 k; |. r
0 J7 U0 S, I2 H, ~1 j/ I
typedef struct( y/ U5 r* a- T3 s  G0 w
{$ {  G8 l" H7 }
        unsigned int a;
  n" Z% x8 s. b' r7 K6 e# s# G( B        unsigned int b;5 B; F/ ^; H3 B' E) s. [
        unsigned int packet_cout;
- ?: I. Y: I  @9 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 u5 \* k! ]4 F  {7 t  B
, f, v9 G% g1 e; s: b  r
void read_MSG_buffer(int *baseaddr);$ n! a& H4 S, g, o0 t
unsigned int count_copy = 0;
# N+ P$ J3 g8 p9 V& ?" \; d
6 ]" K5 {0 e. ~) R: mint main()
4 Z. j8 {7 ?0 @" M{
2 ^1 J! b& l6 B. A0 G. t8 K        int fd;
; Z) x1 m$ V' Q# E& i" q" ~        int *mem = NULL;5 s8 W7 J& n$ G: ^

& e8 K5 X! m2 h* |. W  N) ^( Y2 o        if((fd = open("/dev/mem", O_RDWR)) <0)& A( w) m8 Y- g: y2 |
        {
; I# P8 E5 ~+ B9 _% j! ]2 @, B- W                perror("open error");
$ M: G& O3 U3 E7 D7 h' K                return -1;
* P8 [, w/ p1 z        }/ j7 u- B: b3 l  c2 p% Q# {
        $ J/ E% o$ _- l
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: h# S. M( s3 @+ n$ n- N1 o2 n; w8 m

7 D* M8 Q( H/ @6 D; F  T+ b        while(1)/ |# t1 O) k# [* K# R
        {
3 ?& A1 I8 ~0 L  A2 `- h                read_MSG_buffer(mem);2 k5 d9 u- ~: G; J) O
        }                1 M" x/ K+ C$ c
}) u4 s6 K& b. a* x9 s4 _$ G

. v% O* u$ U8 h7 }3 z# Uvoid read_MSG_buffer(int *baseaddr)9 o9 {5 |/ j' k
{
% s' B  E# B# H! A        pRX_MSG_PROTOCOL pshreRAM = NULL;
- @" @- |( f: q6 `7 l! J8 i# N* K& b! i
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# O2 v& h; ~% A0 t0 G
, ^7 {/ a8 c+ ]  ?$ r6 L        if(pshreRAM->packet_cout != count_copy)
6 q, o9 g- x% U4 j        {
& L9 U8 Q5 ], |. \9 I% n4 y) v* \                printf("a is %d\n", pshreRAM->a);- K( p& o! h2 l- R; e3 J6 n7 V" ]
                printf("b is %d\n", pshreRAM->b);5 Z% X0 r9 p7 r: Z7 }+ u4 q  u4 J
                printf("count is %d\n", pshreRAM->packet_cout);
* ?- \7 A) [# E* f, ~& V                count_copy = pshreRAM->packet_cout;
- d- s5 m- m# t; w        }
! g  K/ h5 o; p1 a7 O2 m+ y0 j4 h        else
* I9 W4 E/ u9 s. h& `; o3 x( P/ W        {
6 W+ o  l3 ~' H4 |                printf("No effective message!\n");) C9 O' i! K) \
        }
# c% T. Z+ F: e5 H; w3 G& n- T; \}
3 D' i6 E2 z5 N
. @5 ~9 s' j4 \$ T8 o6 D' H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
0 y  f$ j: U, [. D, g& X
( Z+ \4 e+ m2 V- H
0 ~3 V6 A' j- v  Y5 x
4 O# a$ h: I5 i. [: |3 K4 g% k, ~0 |5 I5 {( Y# [9 L9 O4 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 14:07 , Processed in 0.041996 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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