OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% d7 p) B# o$ {/ {$ r. n, O: t/ A; J8 U% x% y  K1 s  J
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 p3 ?/ V& S  u0 N. ^! Z1 ]5 [#include <unistd.h>9 \: g- J! @2 A
#include <sys/mman.h>- n! S- u& p" U" b; I
#include <sys/types.h>; X0 A( L" S4 c3 y7 N& t
#include <fcntl.h>* v8 N* R7 l9 k8 h* O: T

2 x5 l! @) p; A9 O% A8 A#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ S7 ^8 v9 F4 o1 L9 v$ d  Z4 w
3 _, l  x/ w* J; }7 {% V" ptypedef struct* \& u. ?3 l/ `% ]- s
{/ r* s; v6 I* _! h+ g
        unsigned int a;
3 i5 E3 {4 D8 B. W5 z        unsigned int b;
8 U. T* {) s9 ^: k3 O  N        unsigned int packet_cout;
% }2 e* v. Y8 a}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 e! f; F; z6 s' m/ d4 I3 p

0 ?. z4 z' z  s2 l* H% c3 y6 \8 svoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);0 S, F1 o- P' k1 p
unsigned int count_copy = 0;+ ~% |  i9 z% q! y& s9 Q
4 ~) y9 I* i( }" a/ @

# O3 N( L: P( q# U; w6 tint main()
( [- X1 u8 X' j2 J/ _) i{
& Q# `+ A$ n+ R  T3 C# I        pRX_MSG_PROTOCOL pshreRAM = NULL;) H& U1 i1 D4 j* N+ a3 A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" z% _, r5 t5 a7 s$ v% N

/ D/ H& N  [1 @! `        while(1)
4 A; J/ l& Y" f! u$ H        {. ~" w" @+ p  |+ J( E1 V
                read_MSG_buffer(pshreRAM);
  T2 O, `+ B: X3 g( J( O& n        }               
. q6 E6 L! F2 `) u4 m4 }! r. V7 ]}1 \" x6 k: Q. D6 V

* z! S! X6 U$ x+ I( {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- R/ H  E* u; a) @{
4 Z+ Z( o# R" k8 ]( F" T. b/ p8 l        RX_MSG_PROTOCOL buf;
, G  p" H- F* {2 t' x        6 [2 F% w4 p; v/ b4 e' Q2 f
        buf.a = pshreRAM->a;0 c/ y0 b- ]! Y% Q  i* m# v: \
        buf.b = pshreRAM->b;
. E' G2 p6 x0 ~+ ]; t7 {8 \        buf.packet_cout = pshreRAM->packet_cout;
; g% a* I# a- c. I6 a6 p; l        
+ s+ X4 M6 q) G3 c" f        if(buf.packet_cout != count_copy)% E) ?, l( R$ l7 P4 p# y
        {" E8 r: A, M1 C* U
                printf("a is %d\n", buf.a);/ F2 w; w9 @0 e" U
                printf("b is %d\n", buf.b);
) r. e/ ?1 m' k; }$ M, B/ d2 b                printf("count is %d\n", buf.packet_cout);& z/ M& [! h) [4 ~: |2 a6 p
                count_copy = buf.packet_cout;
7 D; x+ t/ |( R' k5 K+ P: t0 e        }
4 v: v, t+ u( K: k% o        else5 U; j% U$ t6 r; F3 ]3 |
        {
2 x' A- }: c/ A                printf("No effective message!");
% d7 a5 F/ F# M% s' ]  N        }
, z' I6 l# R4 m6 O}
9 n2 j' c/ Y- b8 \; ?1 F$ i
4 @( Q4 s+ [$ N3 @+ d6 y8 [$ V% c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! n6 N' s/ [0 J; ]7 t1 X+ d使用下面代码,对内存使用了mmap函数后:
1 F" F& `! Y8 k) q#include <stdio.h>* J! ]9 E0 U2 D
#include <unistd.h>- D4 k* u# X' z/ S
#include <sys/mman.h>
. k( B4 ?# R3 p/ O, B#include <sys/types.h>
; {* z( I) g, y) S; e& C  J#include <fcntl.h>$ L! l8 C/ `, `+ w( }

9 q2 C# j9 `2 \1 q) d#define SHAER_RAM_BASE_ADDR    (0x80000000)+ b3 q' e& N3 Y1 D  H6 p+ U7 w
#define SHAER_RAM_SIZE         (0x20000)   1 C6 q$ R3 Z/ [! u+ ?3 R5 v4 v
6 e+ {7 G- G4 P- x
typedef struct
9 u9 V- Q! x  U{. _& V1 P9 O% V" J5 K
        unsigned int a;" a7 J7 |; u! t. e
        unsigned int b;8 o0 ?; f3 n! U7 Y' Z
        unsigned int packet_cout;
+ g. P5 k) p! A1 \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; Q/ M2 g2 [5 R% ^" D# H2 Q$ E

3 c! z. e" d+ D3 y0 evoid read_MSG_buffer(int *baseaddr);/ \9 m9 J! A/ g" D
unsigned int count_copy = 0;
8 R3 L9 K& p' v; m% Y0 Z# ~
2 ~7 K/ z' d  @  G# R( dint main()
( I0 ]! S8 @+ L0 A" N$ P! n2 C4 f- P) {{
# v( V! M+ x9 p! q9 `( j5 [; F        int fd;) C: W5 ^; P' u2 t7 Z; U
        int *mem = NULL;
. x. ~- U% i5 ?. P; ]/ y
1 f* D! {. I- }6 x3 ]" J, l        if((fd = open("/dev/mem", O_RDWR)) <0)1 @+ {. d- U  \  ~1 f# V
        {
5 c) g$ a  a2 @+ g4 k4 O. l$ i# {                perror("open error");6 V9 G4 R) Y0 h% n/ B, r
                return -1;- P2 F% k/ Q; B; \( b$ K5 ^5 {
        }
% O4 G7 R8 o! c        % p$ }3 Y+ r# t, Y3 y- t4 Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ E9 x- g" k3 y1 ^3 u- {

6 p0 ?" w0 ?  T; e( f3 _" o        while(1)
1 a( z9 `4 K; C3 @; |        {
5 r& k  h8 z# @" R& Z                read_MSG_buffer(mem);0 H! x0 m: \" m9 _. M% \' O# c; h
        }               
0 M, [5 S9 ?- {" p7 o, ]8 C9 {5 d}
3 M1 e. P0 ]: w( N. J6 W
8 ?$ D( ^3 P5 @( T  x0 U6 r$ j* Avoid read_MSG_buffer(int *baseaddr)
/ j& j: P  r% ]' C1 t5 [# C: y+ y{
+ X0 K; U: C' h9 |& Z* b        pRX_MSG_PROTOCOL pshreRAM = NULL;
, R" o; ]  ~1 f: r0 f8 u1 S- a3 w* c3 |: d. M* e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 i4 u: O* d# s! W1 c" v$ I
! a, ~  ^6 |, T6 I) P        if(pshreRAM->packet_cout != count_copy)' i5 z5 j6 F# T9 j7 L
        {
! W1 i1 I: F* H' g) b                printf("a is %d\n", pshreRAM->a);
  s  C7 M: }" G8 \                printf("b is %d\n", pshreRAM->b);
4 \6 {$ M0 F9 U                printf("count is %d\n", pshreRAM->packet_cout);8 w- U0 W. `- k7 I! A0 @
                count_copy = pshreRAM->packet_cout;
5 p7 t% d1 O1 E0 w6 c        }
3 r8 S8 A& w# C3 a9 Y: Y$ n) s        else- Y4 _9 g, {4 X- @; G5 U0 }
        {
0 x5 c% |% U5 s- |. Z# l; Y" {                printf("No effective message!\n");
9 r3 r* U+ ^9 f: m  W# W5 |* v        }# u5 f! N$ E  _: S+ x2 j
}0 J9 D) z8 p6 g) d2 V# ?8 t0 r* ~

6 m8 T9 \+ x. K& i& j9 M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
7 U) n* d2 G% \. F. j* \: d$ r! l. D3 e( M, n  `3 g. h9 \
+ b3 e5 }7 a8 {

+ b: w4 I' Y& o4 u
* b( Z% [. _3 F3 O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-7 17:22 , Processed in 0.039980 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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