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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  p; _; D' l7 u; T8 I( ?& l( z0 X. E3 O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 n6 c1 w! X* J3 K, M
#include <unistd.h>
1 x  ^( A+ J0 x+ ?#include <sys/mman.h>' n/ c; f+ ^' f! M& c
#include <sys/types.h>
* i3 h. c4 E" e. _& N#include <fcntl.h>2 g0 V& [5 |! X* l
) j1 b9 V! P  d3 G/ Z: }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   . _' ?' q+ r/ j7 n, N! j% j% @  V

& E9 \0 ]2 N  c1 |& jtypedef struct$ M! I) c1 r- W, Z  b' S
{
3 L# h' I5 }% E' Z# A! R' U        unsigned int a;7 I1 F0 U; B0 B
        unsigned int b;2 o2 o+ m) H" _6 x
        unsigned int packet_cout;
8 B. n" e% h3 C) ^! O1 r' t+ o+ M8 Q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  s+ Y2 G' [. B( i( u4 o* T3 I4 H& K2 H$ I8 r1 m( J6 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, `% b% @! V8 g, Lunsigned int count_copy = 0;5 t5 i1 u! I9 h, c( _$ [9 W, ?

- \# D' ]5 j& @! j0 A  j, {! W+ q) H6 O& C2 |, }9 a& j
int main()+ }" A  _9 v1 A2 ]7 u1 R7 t
{
( `( N! {0 d* p# z" U- N        pRX_MSG_PROTOCOL pshreRAM = NULL;
. F+ n! a  i$ y        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" @  z# m8 _& k& I2 Q7 \$ G4 t
* b4 p1 F! M# d1 U        while(1)5 o4 W5 a: l' T( ~" `
        {
+ o: R3 O$ U5 J3 m0 G  ]                read_MSG_buffer(pshreRAM);
6 ~* T! K; o9 b: e* t" ^1 e        }               
6 {' G; r1 l0 ?) B! X6 _6 [0 m}
: d! C+ M6 S* y! R: N' E  c+ n6 b9 f$ r( }* W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) z! F+ ?. I5 g' u* h3 k0 z6 \{
7 A4 t; l" V2 x/ O        RX_MSG_PROTOCOL buf;; z6 I5 b' n1 f! B
        
6 e' L+ @" @# ^8 f' d6 t# V        buf.a = pshreRAM->a;
- p& C) m- v& F8 n+ l3 |; q        buf.b = pshreRAM->b;
  V" Q' x3 q( g% a) d6 B5 W! m9 Z        buf.packet_cout = pshreRAM->packet_cout;  }3 i" Z( x" K& c% H3 j; h, h
        & Q0 f# f# e  }4 o7 z: h' U7 ^6 }# M
        if(buf.packet_cout != count_copy)
( P' C' O4 {  h* s        {
1 Q& y/ e4 _) ]                printf("a is %d\n", buf.a);1 z( V1 J5 W# A& U  W
                printf("b is %d\n", buf.b);( g; o+ s4 O/ |: X
                printf("count is %d\n", buf.packet_cout);
. q) A! p& i9 Q' G" w                count_copy = buf.packet_cout;
3 g5 E; T2 U& m  r2 c( I% C        }6 \0 v* {% a- B; I( _- {- o/ L
        else# J$ A  J: q; t5 P2 }% d& n
        {6 m1 b/ B. y" v4 h( V
                printf("No effective message!");
+ Q/ N; l! [" X; ^9 M6 K( m) s        }/ Y5 _  h; L7 b5 R, ~# a7 L
}
+ b+ ?/ ^$ F& M) X9 i6 N) w) v5 z3 t& U+ ^; u* f( r3 S1 T; x
$ h1 g! ?- [' N* Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 ?" j  G! B! f7 U% [+ o) h
使用下面代码,对内存使用了mmap函数后:
0 H3 s( I; H* s: x, ^( |#include <stdio.h>
) F" O" t* ^7 V#include <unistd.h>8 `) j4 l8 B! a
#include <sys/mman.h>- i+ ^! a9 ?( V  P$ i+ n- i
#include <sys/types.h>: Z# n8 E, Q3 X* M
#include <fcntl.h>
$ g. W* t( i. j( M  T: J8 m4 K; b3 w
#define SHAER_RAM_BASE_ADDR    (0x80000000)
* ]$ @- ^( r" r8 W#define SHAER_RAM_SIZE         (0x20000)   2 [4 U5 }' I. V/ K( M0 J( f2 H
: o' m6 F. \5 S7 K
typedef struct
  @+ a) I6 e$ i) t0 M; o1 P4 j& K! G{
5 s7 C4 Z0 V5 H+ v        unsigned int a;; e; L) F' ^  Z: q2 q( S
        unsigned int b;
) K& {5 G6 P6 }% _7 Q- a. j7 m        unsigned int packet_cout;
) a1 g/ L* K' P8 U2 @3 I}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; A+ B6 U! |, @! y; M
/ n" P6 x- J; v
void read_MSG_buffer(int *baseaddr);
! p$ k+ ~% F% W/ s! Uunsigned int count_copy = 0;
+ E8 P0 ?2 ]/ U0 D% h" x# N+ Y8 m/ }  d% f( m
int main()6 @) D+ d6 W' x6 C$ t
{# @* f. H! M1 I0 L1 {
        int fd;
8 d5 \- s' O( R# ]        int *mem = NULL;
+ I* V/ L" `0 Y1 `" D: V' p- Y1 ?0 W8 ]! m
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 c: Z" I( w! q! N( }        {
+ y4 K# P/ i) [9 p                perror("open error");
+ h8 y" A1 Y1 `7 y) z0 T( ~4 L                return -1;
" \! }/ M: e. G/ U        }
& D7 R' J+ Q7 s1 i9 ]        2 Q, l% X# K) E3 i
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! ^% c) h& s) b
" @/ Z& U: g- G# y  m8 p- ~+ ^# W
        while(1)5 p8 d; C" t8 w' Q+ p
        {; E& h* ~' {9 J/ T( z
                read_MSG_buffer(mem);: f  P( t% f$ o+ f
        }                9 ]9 x# _2 X& T- K. }+ d- @1 X
}
5 I; d: J1 R5 [% i' b" R) i8 `7 g% X% V6 d# h$ G) X3 Z
void read_MSG_buffer(int *baseaddr)) t% K+ X, O) @! M1 ^2 Y
{& c. L7 P  V4 W% [5 U
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 N5 k9 s( ~, N- Z0 h, ]# v5 i  g! ]: _5 `% H: |
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. k: @! U. Y. f% `8 O1 q- g+ v, V  u- F
        if(pshreRAM->packet_cout != count_copy)
6 O/ L2 r! V$ H9 E  [/ e! {- T, D        {1 L& b; R! E+ H% _' m, B
                printf("a is %d\n", pshreRAM->a);
' y* `- E+ K7 C5 P                printf("b is %d\n", pshreRAM->b);$ |9 l4 R: Z1 E- Z3 I) V5 i3 X
                printf("count is %d\n", pshreRAM->packet_cout);
. m& F; o* \- x& ?                count_copy = pshreRAM->packet_cout;
6 S) U8 l# n/ |, `/ j4 Z        }' l( W  e3 ^4 {! x8 v* Q" R. n
        else) v) f8 Y7 z& i
        {" b( V& ?$ v' `' o, }2 c. A
                printf("No effective message!\n");5 D- ~  w& q5 n: s
        }8 v; i& C+ \/ D5 I/ g9 Y# }+ g' z
}
4 I- g5 W. F0 X; ~
* ~( z8 n2 l; p( z! u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: ?2 S- ?% Q) C8 J
" P( c3 L2 S* l2 Z# f" v3 v( x
8 O) Q2 }" |: `$ d: U  L/ @- ?& R# t7 `8 m& P: K# I
: Q: `) J3 ^$ M4 {. Q' [+ R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-18 23:45 , Processed in 0.035669 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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