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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
/ N, E- }! s* t+ F2 n
9 g! E4 S' a3 ]' h* X% R6 L" L$ @OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( q- S+ \2 P3 {' k* ~4 B
#include <unistd.h>4 f( b9 k& c* t5 R$ {: _
#include <sys/mman.h>
9 N2 O9 _6 B# }7 l#include <sys/types.h># `) L. L; k6 k- a" t
#include <fcntl.h>
$ p" I/ ~- Y1 S4 z4 I* L# M3 C& |2 J! w- j- p7 f# J/ A( E
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 W2 y4 S$ V# P6 b& N2 S5 l
, R  f, n! u: ?  y$ ^/ R  ktypedef struct
4 y3 `* o) l9 A$ z) H{
- \* h+ {* @5 r) u, }1 `9 G        unsigned int a;
$ H8 Q9 V7 h, S- V9 p% I        unsigned int b;
8 w2 ]0 o! S8 a+ x$ J3 ~) G        unsigned int packet_cout;
/ J3 |- s) m* r; ]- a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. H3 E9 }" ?0 M3 ]8 a# b4 l
  \0 H+ L7 z; }
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 a5 V* o! {, i/ W' t0 W6 ^unsigned int count_copy = 0;
& r* y; \$ B  }' d
# p8 D" `8 d$ n7 R1 x
3 L) c6 Y( S3 g4 u3 mint main()$ G5 l6 v! _4 F# Q5 Y& t
{. n0 B3 x% t/ [) I! q$ R
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& ^4 X$ R% O; _/ |" S6 s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 J* B1 ]7 Q. h4 _7 u: m
: C& Q: ~; L/ H8 ]0 ~' H
        while(1)
& C6 a1 Q. N0 t! L        {
; T7 n, m+ Q1 h4 G! p                read_MSG_buffer(pshreRAM);- t- X  i/ y; @6 o0 a. i. c9 G
        }                + @" O# m: c/ C0 Z1 `% c: z8 k; q
}
3 I) C' K4 K+ [& o! N( ^1 N* h  v. m% }1 \3 s' Y! b1 z" ~; }8 T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 U6 K! y5 c  \
{
. S, w9 _# j) V9 j        RX_MSG_PROTOCOL buf;
3 |9 h: \/ I7 E) V3 X9 ~. e: \. r        
. p# M! l6 x+ z- g3 ^        buf.a = pshreRAM->a;
- c# [  f  T% M! s' T9 _6 o+ o. z        buf.b = pshreRAM->b;
# j" g% S7 {$ r0 [, U        buf.packet_cout = pshreRAM->packet_cout;
; R% W$ h+ Z" s        
5 S+ V9 L$ J8 Z9 B2 ?        if(buf.packet_cout != count_copy)
  D0 U7 W9 _' u* F# `. r. L8 w        {1 \6 i! ^0 b+ q$ ]  T
                printf("a is %d\n", buf.a);
. x) i3 @1 H* h                printf("b is %d\n", buf.b);
& z- u/ ^# @9 \& s  _                printf("count is %d\n", buf.packet_cout);
5 {6 `2 f6 N# N' J$ x                count_copy = buf.packet_cout;
8 f- j, e/ D% F% d1 J        }1 y7 N" [7 p4 v0 \, p9 D
        else. E$ O& Q: ]( _6 X2 r  }
        {# d- F: y/ p& k! @% ^+ }2 i7 f
                printf("No effective message!");$ T1 v% i, o$ Y( H# e) `8 z
        }* f' w6 h, Z0 m9 z, L
}' q/ Q$ F7 O/ i1 `$ B
% Q9 \5 c, P; q& g( I% M/ c
6 n5 n* W' Y  ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 G' C1 h, \3 x  e9 r* r使用下面代码,对内存使用了mmap函数后:7 p8 k* E, n$ j$ P% D5 r! A
#include <stdio.h>
! r! C7 `% B6 f6 D1 r! K#include <unistd.h>
' o& E- n" R" m#include <sys/mman.h>3 V& |: k4 J1 o
#include <sys/types.h>, L8 Y" O  `8 t* \2 d3 b
#include <fcntl.h>& T7 F7 k& c9 J' R8 K1 A6 w+ J; d! s6 Q

) }' k* S( Z9 p) c, |+ o3 H#define SHAER_RAM_BASE_ADDR    (0x80000000)# i# S5 N) D# {) z$ k
#define SHAER_RAM_SIZE         (0x20000)   
6 Q/ p3 W! i% z# o+ W5 [& c: ^7 F
/ c' p  s& W+ c9 x& n. Ctypedef struct0 e( I* }& D+ V9 g: R; o
{
3 x! f+ h: ]- B5 ?& ^        unsigned int a;3 ~# U: q$ ~: c, G$ l5 e2 s
        unsigned int b;" I. e5 n8 T& w* ?3 [
        unsigned int packet_cout;
  k# ]5 y+ Q4 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
) C% {, ?- `1 C6 {+ V
$ }9 l- @4 h" d0 f) Y% u3 d: rvoid read_MSG_buffer(int *baseaddr);" ~6 w& C+ O6 I* r5 W, P: f
unsigned int count_copy = 0;
5 S5 D5 W. l3 |" \. ?% q4 v) N* X2 g
int main(): a0 z  v* X) i
{3 m# Y8 `" f' d4 h0 o1 i
        int fd;$ E) }+ \. f6 ?+ x
        int *mem = NULL;  b! H% a. b- E8 o4 ^9 f% O
/ h$ ~) z; `) ^
        if((fd = open("/dev/mem", O_RDWR)) <0)
& Y# [% l0 n! c0 n+ ]& d$ u+ R' G% I' Y        {
7 O% _( w1 t! r0 C# {1 x; I, B+ G+ u( F                perror("open error");. P6 r8 m$ s' f5 _
                return -1;1 P" w4 x* s) V
        }2 |# [( i2 d  `
        7 |* \7 f1 g# T
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
! l. O7 _$ H' s, r7 {. ^' h
8 T/ Z" o- G. t! G  A        while(1)* a, G9 H! c9 C/ a6 h& N
        {- s; p. k3 _% V" ^3 }; i7 U8 D# g
                read_MSG_buffer(mem);+ C$ m+ Y' h; W
        }               
" D+ ^  z3 W7 N3 }* q% G}
5 B% E7 i% C, i$ S8 V0 C( l: T, W% f0 i7 n. @
void read_MSG_buffer(int *baseaddr). u" n3 f& |& `1 C) O
{& {: ^4 ?/ p/ b6 O
        pRX_MSG_PROTOCOL pshreRAM = NULL;3 X! N4 A. X! c# q+ Z# }4 v

; Y7 p; Q, E* Y% c! w3 j        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;  ^7 C% K/ R9 ]. O% S
/ @; a3 m, Z: Z" l1 S2 o" z7 z
        if(pshreRAM->packet_cout != count_copy); X1 T3 L/ ], a
        {4 J8 U8 I' F9 l8 V. \
                printf("a is %d\n", pshreRAM->a);
' ~: G3 }/ a, L2 G6 c: l5 u                printf("b is %d\n", pshreRAM->b);0 m; d, u7 ^# l( M* I$ X
                printf("count is %d\n", pshreRAM->packet_cout);0 a. \. W% I% D, P0 r  F. Z
                count_copy = pshreRAM->packet_cout;
( Z# L: z- P  w" f* D: J        }) a2 L5 m$ E  @! Q* P
        else
$ B  }2 Y* n# }1 F        {
$ z7 r! ]) J* c0 z% c) Q                printf("No effective message!\n");
: X6 o3 c4 D: h        }+ F' b' ?6 v3 K. N7 m% h
}; U9 @0 b" @6 o# p/ P! J

7 E- w; q# ?' ]) X* [0 p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: @) b! y* r- j& B: g9 d$ z" R) X- \: U

5 G, B$ O+ _" y8 ~' S
$ H8 ~; e, M+ H" g6 s/ |* u
# e/ F. _2 _6 U- l! p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-10 00:12 , Processed in 0.041157 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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