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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - V  c* u) [% X% B! B/ [

' A' H$ @/ z5 q5 B+ P5 t' g' Y0 VOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
! [) @6 c% l' i6 @9 t& h#include <unistd.h>
0 G- p8 [$ M, H: S' g4 @6 J#include <sys/mman.h>
- L  h3 r3 T0 n  G% @$ \#include <sys/types.h>+ H# {+ ~3 g* V
#include <fcntl.h>
& H* c0 K$ L7 w8 J  O7 A5 x2 C$ P8 y! M5 G
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; [' T. a% A/ g2 m4 f- T
. j2 s$ S8 Q4 X, l+ i! x' Stypedef struct2 V3 E7 R: r- c$ r7 i% t; j4 o
{
8 q( o$ e/ n' h. q        unsigned int a;
+ |3 M  {% ^* ~0 I' M        unsigned int b;
7 V5 y$ m( h! m( i( q( U7 y        unsigned int packet_cout;
  d( _3 O+ R) c+ `. F3 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! d& c5 r: R# E- W6 n( @: x! B! ^5 u* y2 S$ A: o
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 z4 H; O) B% J. |unsigned int count_copy = 0;$ G+ P0 \5 ~; `) Y1 h" ?

( _! P4 D% `9 I- v( L
4 J9 f( {* p7 @6 n: Uint main()) X7 u# \5 k" j! P7 \
{/ ^" f1 Z! V5 _' y- n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 ^( l* M; ?& u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; b, |( C/ z: }* L9 e/ _  |2 {5 W/ T
        while(1)+ b4 r3 a! {1 x
        {
/ L( k4 @3 Z4 I% E                read_MSG_buffer(pshreRAM);
' {0 z! O5 E$ y+ C; x        }               
/ M' x* X' B5 ?& h}6 O0 E8 Z' z# l

0 y; W2 o3 }: vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
* L7 |6 x2 b3 ^. n7 I7 e{2 L/ t5 z( I5 w* g1 A* W1 W1 ?
        RX_MSG_PROTOCOL buf;# V' r0 u" z8 t6 F: D$ H
        % X7 s$ L# K+ M
        buf.a = pshreRAM->a;( _3 Y: m' h+ H- q7 C+ R
        buf.b = pshreRAM->b;6 v1 e4 X, J# B$ r
        buf.packet_cout = pshreRAM->packet_cout;
& j7 y& w9 C/ i8 E/ l  G        4 O; M; _9 ?1 o8 L) M6 d2 ?
        if(buf.packet_cout != count_copy)  u- K* p& z, `1 `# j
        {, W8 j) L# U& m% ]& m
                printf("a is %d\n", buf.a);3 [5 K! ~+ h2 s3 e
                printf("b is %d\n", buf.b);
1 ^, n3 q# o6 N) P* T6 j5 S                printf("count is %d\n", buf.packet_cout);
. _2 |: W+ k; S3 z, ~3 B/ j                count_copy = buf.packet_cout;
! y" Q2 e: @0 U9 n        }
4 e% m2 ]5 J5 n0 D        else
8 |, _# {) k$ S3 w2 A3 d        {
+ P8 Z3 a( H- ?. l  z' O                printf("No effective message!");
6 j3 i4 U0 D7 z9 T8 t        }0 {- z" a9 x+ H. d- t, B
}
6 {- z1 _2 ~3 v0 U& m+ W& E' T0 R9 C6 Q8 O; m/ X6 b1 w( |4 v2 ?

+ e& Z# ]. y# X但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" v4 ?$ I$ j& @3 e使用下面代码,对内存使用了mmap函数后:
( c8 f, L. T' q/ Y3 D#include <stdio.h>; ~. X: r  g. a* P8 l! U
#include <unistd.h>$ g7 q" Z7 i8 ~  h) U& ]
#include <sys/mman.h>
  ]- x7 x$ o# y- v5 H2 R#include <sys/types.h>2 I- y$ J4 H/ X
#include <fcntl.h>4 \/ X, `, a  [4 ]. p# d6 J' i1 M% |
" A* K2 q/ a0 @, t2 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 x3 Z, ]6 t* ], E6 n+ ]" u9 r
#define SHAER_RAM_SIZE         (0x20000)   
  J5 s; d8 m/ _0 E0 z2 G# U9 w
2 l! Q+ Q# \4 G7 c) [typedef struct
, b+ [+ _5 c3 t{6 k2 ~. F& ]" R8 v( ^. t; r
        unsigned int a;1 w0 d* h: c" R* q8 g$ _1 H
        unsigned int b;
5 B+ X, H4 }* H2 B) ]        unsigned int packet_cout;; g0 L! M4 n% n& y. ~8 }; Q% h& x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 X+ h% F, E# I7 o
. G4 o, w, W7 S9 h; m6 u
void read_MSG_buffer(int *baseaddr);
. \; e3 c$ r8 _. w+ Iunsigned int count_copy = 0;5 w" ?$ n8 L0 f! u1 T, A

& K/ c' V9 a; [6 jint main()2 s9 X' N; Q( i+ Q! p& `$ ^( y
{
+ {9 b6 D5 ]. `7 j) ?* b6 c2 h        int fd;
4 g6 L8 @/ a% d/ @/ c6 q# P        int *mem = NULL;! C( n$ ^, i2 K2 h7 I, l8 d2 }; z9 T
& m* Q$ M# }  q" T5 W
        if((fd = open("/dev/mem", O_RDWR)) <0)) ^7 S4 J- Q$ c1 w4 X# n) f
        {
4 H5 f8 [- ]  R( f9 u; r3 n                perror("open error");
( `2 d' E6 u1 ?                return -1;! M" a: _+ P+ `& r
        }, @, W% L, s- U
        8 R+ [& B  b9 X4 |& G
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' L4 S+ G7 ^! {: I: U

7 ^' }/ k" d. `, o+ ]        while(1)+ j8 g: h3 {1 t1 F' N. I+ d' \, F
        {9 W! w1 m0 b0 x
                read_MSG_buffer(mem);
7 S6 s' Q6 {. c        }                + }. Y. e- X7 o2 J9 @
}% C2 ~4 y6 @4 z/ b

1 ~4 E' V1 w5 _+ A( e8 Ovoid read_MSG_buffer(int *baseaddr)
6 c* q- J5 z* n{* {4 D% C) _. b* i1 M0 o: r6 ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, J  G2 R) F- i2 f, M4 B' {3 C
3 |, g" E, u9 t5 B5 s1 m3 f; l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! g& ~6 P& P- G% D, G& I  L
; K! T1 R6 M! P4 j. N
        if(pshreRAM->packet_cout != count_copy)1 r( @8 m" @* p; R$ j: N3 _( R4 o0 I
        {
# q( N" p8 `7 S1 Q  V% t( ^, n                printf("a is %d\n", pshreRAM->a);, f# I0 u. q0 ^! A' H& k6 F7 E2 i
                printf("b is %d\n", pshreRAM->b);) {4 ?9 Q8 E& k8 C2 _; P; c
                printf("count is %d\n", pshreRAM->packet_cout);$ ?" P7 K9 h# D! `$ T1 q
                count_copy = pshreRAM->packet_cout;
9 {3 V) N7 J7 k- k# I( O        }
8 b* q% p- D* `( b& F* [        else7 I( E$ m( \" f& \
        {* z; d# }2 {5 ~* C% K6 f/ \9 [! j
                printf("No effective message!\n");0 m% y  c% X' ~& {5 f
        }! c! G1 D1 D: e2 x: v8 S1 K' l
}7 g" @4 c7 u' U% _, }! n

8 j' J5 D" [# ~% X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
8 a  J8 ?: t9 A+ g: f$ `  l6 Q2 Q- O+ d6 D: P

/ H8 x# K% c% T2 s8 M/ p
/ \6 Q! S, k2 N) Q* b! q- T" k* ^  j( j, t' ~* Z1 O3 J/ f  K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-12 02:07 , Processed in 0.042202 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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