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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 ~+ e" f6 _1 H) s5 M# U% t/ l# ~
% \* T4 i5 e! L+ d+ ?5 U
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 h8 S( @% g  h3 q* n9 w9 [( W#include <unistd.h>9 x% Z& u: R1 f) Y4 G
#include <sys/mman.h>
' e+ B  J8 D& r3 w. x#include <sys/types.h>& t8 Z9 U" d( u: [0 w
#include <fcntl.h>
+ k$ k9 I, e  I
, R0 ?" }- c5 P7 }2 u) x9 x#define SHAER_RAM_BASE_ADDR    (0x80000000)   % t! N# u8 j+ s1 ]) A

7 c" [& A8 ^2 q2 C2 itypedef struct
8 a: F4 s" u' ]" y2 s+ `{6 \) j% `9 m- T' x) l
        unsigned int a;  o1 s. ?; P2 Q  j2 \7 j
        unsigned int b;0 `% x% ?: B1 Q( n0 I
        unsigned int packet_cout;- ~- Q8 C. v. b. n; u! Y3 f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 m" |' o% V; }; p

2 b% W9 z6 j# Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);2 W( g4 B  P$ m; D; c
unsigned int count_copy = 0;- H: S3 |  }% Y& d7 T

/ t  x4 h$ v, W+ s# f5 @$ l: C/ ~% F0 g* _) ]
int main(); ?9 _4 p3 p0 _+ K# K
{
6 }! ~; J* l) o( f( K        pRX_MSG_PROTOCOL pshreRAM = NULL;' J% J" l. }. H
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 ?6 ~* }$ X0 ~3 T6 E9 F! O7 @1 v" |' x1 e. R+ s
        while(1)
4 Q; P( Q9 I* x) p1 L+ |7 |$ A        {2 m( G' t% s$ d
                read_MSG_buffer(pshreRAM);
5 W3 Y! B. c" e: n) A! W  i  C: d        }                # }' j0 }; I8 ]- W$ ~
}4 Y6 H" ]7 F/ n3 Z+ q
% K9 L/ Z9 h& q# p- ^' _& H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 v6 ]& ?% l4 b. W- x9 ]
{9 U3 r* c) L& J7 a3 L
        RX_MSG_PROTOCOL buf;% [( @5 _0 C' C5 p- x
        + t5 b, ^3 r. Y9 l: N
        buf.a = pshreRAM->a;
5 T+ X6 E; y% i' @, C0 ?        buf.b = pshreRAM->b;9 @' ~- E% h1 n0 m% t8 [6 C2 k5 M8 B
        buf.packet_cout = pshreRAM->packet_cout;* L. S- o- r" L! \% x9 L) B
        
& q9 C; c; Z9 p1 o, N% [% J5 |0 R        if(buf.packet_cout != count_copy)1 ?, ~, Z, n+ H- J  n
        {
) a: P5 ]4 y8 x( l! B8 ~                printf("a is %d\n", buf.a);3 B/ Z: e! ^' M/ a$ H5 e) l3 A
                printf("b is %d\n", buf.b);; X6 N% |, u, h& I& M/ K
                printf("count is %d\n", buf.packet_cout);
- i4 Q& O% ?% r; y                count_copy = buf.packet_cout;. s2 ?& B4 M  K+ L8 C; p! f- W
        }
1 F: T, }( B& ^  z  _3 ?) `        else# B" z, a- t2 u# q5 _
        {7 l$ I6 M1 ]7 s. H: C1 v( |: \4 h
                printf("No effective message!");9 Y! p* {' [3 e1 P6 n
        }
9 _6 ?5 W* a# L! }3 k}  W' c" A& v$ d; A3 v( {
/ D& U0 w" R8 M/ s- {4 r* w
% {  W7 o) X- b
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# k5 e1 _3 Q. n  W9 Z8 t# s' p
使用下面代码,对内存使用了mmap函数后:# F8 B, v3 P. _( U. f! e
#include <stdio.h>
6 h: d1 ~, @, s( e#include <unistd.h>, q3 g3 F4 ?! X, j8 W5 j
#include <sys/mman.h>; W  ~7 n) T* B
#include <sys/types.h>
3 m/ h" T7 y2 X  r5 |" L( z#include <fcntl.h>- l1 o3 Z2 x( B3 L- o' S& _, F# q6 s

* b' m! m' m  A7 Z% S#define SHAER_RAM_BASE_ADDR    (0x80000000)$ H1 z$ X+ Z8 Q: M0 B  |; ^
#define SHAER_RAM_SIZE         (0x20000)   : w' F5 G8 r# m7 V9 U5 B5 P

0 K# V7 B9 X7 [9 a5 f5 Mtypedef struct
" s% z. _" Y4 _/ Q{
; p6 ~) s& F- R  j. U; _" F/ Z7 m        unsigned int a;
$ M8 y+ S8 d) M) \6 }        unsigned int b;/ k2 U0 n) `7 ~
        unsigned int packet_cout;
  Z  J9 C- P4 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 A2 W- A: A* g1 D( Z4 \7 G
# o2 `8 @0 A* @8 |void read_MSG_buffer(int *baseaddr);
$ j$ l& Q! S4 j& gunsigned int count_copy = 0;8 H" G9 j, ~, y3 k/ j5 k; M
% f2 N3 j, ], h: _
int main()7 e2 f  i# D$ s/ d
{2 @& _6 u1 e& Q( f7 W- H
        int fd;0 p3 `9 n$ R: l6 m9 B
        int *mem = NULL;( B4 S5 g2 p6 q# a6 o. ?

: {! _$ v# U9 m% M4 C' i        if((fd = open("/dev/mem", O_RDWR)) <0)0 E: E' {, J; e! m  S! q- _0 `
        {9 E; y& X2 d, \1 B
                perror("open error");
% Y. ^/ ]# j5 w; f                return -1;, k- D! Q0 ^! |) s
        }
2 p& F+ X  @2 V2 W$ J4 o& A        
: x8 e2 L4 X0 U2 p  g7 _3 W3 p! O        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 M/ a: H' m: i2 a# h& X% I: P
& ~2 u, O( Q% v5 p' J1 z8 W
        while(1)
7 {8 h1 F) r% q+ Q% c        {
( J5 D; D, k$ p- D7 [9 A                read_MSG_buffer(mem);
1 J1 Z: D6 s' ^9 e5 _$ [        }                $ C$ a% _3 }# o  ~( o# n0 k
}
& l. k! \" h0 H1 X5 l6 ^& w) c( [, C& x& R) U4 N
void read_MSG_buffer(int *baseaddr)  p" m: j0 I" V3 ]* y* y# f
{) W+ }0 s* Y( L4 ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 U; @+ V% a* K/ z, S
9 V3 W1 e6 S: o# q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# Z/ n% U& @1 D1 p# k, A) u. H

' H$ N+ c: U. H, D3 f        if(pshreRAM->packet_cout != count_copy)
' r* R) e( E8 u1 o9 X$ B        {$ w7 N1 g& |9 m7 e4 k$ k* t
                printf("a is %d\n", pshreRAM->a);: L7 g# W" `2 J, p6 K
                printf("b is %d\n", pshreRAM->b);9 B' O9 e6 S! j  G: c$ s6 G' m7 q
                printf("count is %d\n", pshreRAM->packet_cout);$ Z# O& {$ b- e, X6 z  G; S' p  e
                count_copy = pshreRAM->packet_cout;$ l9 C; l* m% Z$ ]; `5 D4 E& Y3 n
        }1 w# f1 f6 o5 Y) c
        else- x5 K% y7 x) p  j4 ~& @
        {
2 Z& A4 h$ U% N5 x$ }                printf("No effective message!\n");
6 `- r8 _0 b9 }/ Z4 n        }7 E/ q3 g6 r; _( w# I
}3 g' m, Z# i8 Y# ?& k
" w5 y+ Q  Z0 {. ?  q9 Q8 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
6 k" `$ Z! X! O9 n( |; `% f. O
1 S0 |8 L5 \6 R$ P" q8 D
9 \& c5 r0 U$ j) ?6 u- Y! Y
, E, J4 c8 l8 y, [: ?9 \7 V* K5 ~  i- [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 18:22 , Processed in 0.038012 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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