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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) D, J+ v4 y* j* L/ P' o) D. o% k7 c$ p0 o: L0 [6 {" ^5 U* p/ D3 X5 ^( u
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* Z' H. B: h. @6 a
#include <unistd.h>4 u7 E8 n) C. o- O4 I# z
#include <sys/mman.h>3 ~2 W  n. w+ q# W5 [" N
#include <sys/types.h>, r- T& T8 j, c, O& h
#include <fcntl.h>: }* B  I; ^. I- Z6 I

' z' p# b% H4 a+ s#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 e2 W4 R1 D4 f* G' y

/ N8 D# b- D/ O6 P; F! ~$ ^+ }typedef struct
/ ?6 ^/ i1 H+ h& X  Z0 |{+ ^, R  u  p( z* J0 t( I
        unsigned int a;
3 Z, e8 q3 Z  B        unsigned int b;6 y/ H4 i5 o0 P
        unsigned int packet_cout;
* p# C2 r: b8 ^; R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" c' B1 d1 |8 t! M; a* ~
2 Q2 s% S  P0 U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& N  W2 y5 e$ X8 z$ k; `  t
unsigned int count_copy = 0;
" S6 D% \. S. O
7 Y6 V( F: O' P
4 E4 \; d9 r  z$ |1 @int main()0 H. b* R( p" n# H  h% n
{) I9 e4 J0 M2 u& n9 \0 [; `0 M4 D
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 j+ G" K; Q; z8 W5 }( |( W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 Y% A" @. A7 J6 a2 K( L

3 G, [' v5 }7 z# Q        while(1)
1 X: K1 l* [" r' G( G! r        {
$ |2 E6 R8 S" `2 D4 A                read_MSG_buffer(pshreRAM);
! F; c- e; x1 g2 r! j# Q4 G        }                ! Q8 d) H2 Z9 o& I% \
}0 q  I0 f5 k6 X4 O+ C1 M

5 I, k' c# c- Y' u& q) p8 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ d5 Z1 I+ i9 [8 F1 S" B  {+ E
{7 c8 x" j2 c9 r* f( }
        RX_MSG_PROTOCOL buf;( ^" |0 s# _/ x5 h: E1 l* {$ c
        * a& x7 |' W  G* s" ~2 t8 s" x6 {, Z, K
        buf.a = pshreRAM->a;9 q6 E! O8 e7 A9 _, P
        buf.b = pshreRAM->b;4 [+ s; d) B9 S* ?& J
        buf.packet_cout = pshreRAM->packet_cout;/ R; J- o# K# Z/ Z& l9 b8 G
        
2 `  H6 W4 r; W9 C$ {        if(buf.packet_cout != count_copy)
8 e' f, T4 b! {: R        {, R" `9 b7 T, L6 M& p8 z3 x% S
                printf("a is %d\n", buf.a);& Z3 u, t# A( e0 e8 T+ a
                printf("b is %d\n", buf.b);
4 Z6 }, {0 ^+ i( _                printf("count is %d\n", buf.packet_cout);
+ H" H) W# ?7 }  H9 C  K                count_copy = buf.packet_cout;" F# ]  ]6 `; d) J  [$ u
        }
4 O" n4 F( L7 Y        else
6 n/ M9 G8 R5 @0 F; @9 w        {
+ m7 X, o% @7 P! N! d                printf("No effective message!");
- A( o- K7 Z% y! k+ o7 ~& k+ \# D        }8 T9 \* S. ]' P5 d1 E
}
. ]+ ]0 B0 m8 ^/ w/ h6 d
  ?& |2 b& A  z: c( l# f! n% t
4 b0 J6 e; n1 k5 m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ z  x, |* m; ^4 N* C) u
使用下面代码,对内存使用了mmap函数后:. t' x" {/ c' s' B% E$ M0 m
#include <stdio.h>
) a  L# n4 c8 N6 t5 p! J# f#include <unistd.h>
* L  k4 e9 q' H$ M# W#include <sys/mman.h>  s3 K$ U% _( m2 d' Z8 v
#include <sys/types.h>
, l  ~2 C2 j$ ?; V% V2 x. Y#include <fcntl.h>7 n+ s2 f/ Q! T9 U4 y
! i9 M2 D, O0 i( @
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 A( V4 M; \5 X! y" _% z/ Y( [5 V
#define SHAER_RAM_SIZE         (0x20000)   * Y7 m$ n& @% g0 @

2 x! F0 I' R5 }( M# Utypedef struct# t- b2 ]" H0 {# e! O
{
# \# F6 F' q$ n# P2 T$ B/ ?        unsigned int a;' K+ j3 t8 g1 C( p1 E: ~9 S7 O
        unsigned int b;  [2 ~/ A$ f- o+ ?; B* i# y$ N. Z
        unsigned int packet_cout;
7 E4 k; L5 [+ D7 o3 ]( L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! ^+ H( d9 r/ f9 n" g# V9 m7 }7 t, o7 e0 T- {8 |1 Z
void read_MSG_buffer(int *baseaddr);
! d3 L& {8 S/ ^unsigned int count_copy = 0;. g  x! c% n0 O- s0 y

9 h, R+ @! r* D' qint main()
  l! j% W" o. {{3 w( Z1 h4 E0 Y, a9 Z4 x. \
        int fd;
1 I3 Y* ?" T' K+ ~        int *mem = NULL;, Y) ^5 w& k1 {9 x( U9 a. F

3 b2 d- {$ a& h8 q1 _        if((fd = open("/dev/mem", O_RDWR)) <0)
) S! h) @/ |/ u! ^% |        {1 n, P$ v  L7 V
                perror("open error");0 Y) X1 D) |0 e
                return -1;
% n# u) o  F# `" b+ o. W8 R8 w        }8 u6 x' y/ q+ L' O
        , Y1 t9 {6 k( w+ B# I
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 V: k6 o" K% z3 z. g- u
# k" R+ Q, n+ f
        while(1)) z. V- b( @0 V; k, J* ?. Q6 m8 N
        {+ O' s( x3 g+ u. Z% F! r
                read_MSG_buffer(mem);: j% w+ t" I; S# b$ T/ x
        }               
8 u- P. T5 B: f' Y! v) ~, i. d3 [}
% C1 _% Y3 Z& c" [0 ]) q2 @# f5 F4 T8 W
void read_MSG_buffer(int *baseaddr)
/ [4 J3 s  r: T& l{
$ A: `& B) j( u        pRX_MSG_PROTOCOL pshreRAM = NULL;1 V" ?$ ]6 I2 n4 B# {, `8 t' ^
6 n- G! n8 c2 J5 R) f
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  w% f6 x+ i% _2 Z3 i( d8 Q' ]$ c' M" }1 R' w- L
        if(pshreRAM->packet_cout != count_copy)! L3 \  M. O+ ?; m
        {
; m$ z  A6 ~% h                printf("a is %d\n", pshreRAM->a);
' {+ |/ Q5 X  Z; e5 H) j' v! c5 |                printf("b is %d\n", pshreRAM->b);
+ I8 g: J( r% T8 V) R) D                printf("count is %d\n", pshreRAM->packet_cout);
: x4 N) B8 L/ N" `% j9 }8 V' h                count_copy = pshreRAM->packet_cout;
* Z6 P- c) ~1 u2 N6 @% k6 A        }
  H8 `; R1 C1 p, z% N1 \        else% F8 a* O; Q# w
        {
; X8 P, \0 K! h$ z: m2 y2 C                printf("No effective message!\n");
- r, A8 r9 A2 \9 V5 Q        }; X; T: p- U) g- @: f' c
}
( |; [$ q/ t- T1 w; N' {0 R
" a% k, G+ d& w+ j* |2 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& V% P2 n4 b# `9 k$ ^& l' R* D2 d# W* V' p4 h6 S) V+ k
4 b1 j8 E! {6 _/ g% T& R' g3 D
6 l& a1 P4 Q& s
1 o1 d! L$ S$ B+ J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 06:53 , Processed in 0.037887 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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