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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % [2 Z$ g0 [& S$ {. f% x4 U* z
9 y0 z( k* i( e# ]5 T5 M. g" c
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>3 C3 h. o" B0 @
#include <unistd.h>
. I! p  P! Z; s#include <sys/mman.h>! g7 l9 p0 M; |, |4 }
#include <sys/types.h>8 w. T' }. X4 {
#include <fcntl.h>
9 T; d* N9 n: s% }+ n( u
0 w) C" c0 Q( t" y8 E. T5 K#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 C' m7 @$ o0 v; o
* v9 M8 O0 B$ _2 A9 F" z, Ttypedef struct- w  P. {& c- }+ C
{
) l7 Q' I4 A: G+ z5 @        unsigned int a;2 |( P8 l4 C! E$ D- @1 s  z& \
        unsigned int b;' ~( h* ~. Z$ [; a* x$ D
        unsigned int packet_cout;
' }8 }; s1 \" R+ T  n0 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& c& _5 F6 j7 P" _. D7 R8 ]
0 I7 X$ ?% ?' A2 x& tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);; r* J- g$ x/ u: y$ a
unsigned int count_copy = 0;
! \3 O' E" x! u' l' w" `
, t2 H- O; @* c4 Q
, v; n0 l5 @/ s6 j( cint main()/ F+ d7 E* `5 B* s4 h3 V: a3 b
{
2 G) O" e2 ~' S2 F, Z, T4 b1 c        pRX_MSG_PROTOCOL pshreRAM = NULL;
( s! F* ~: I" y8 ]0 @6 A        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- M' s  k1 J$ s0 K/ ~0 K% I
* A* F; L3 @* K4 Z6 J/ w
        while(1)
1 D& n3 J) h% \* Y2 e: ^+ Q  k+ P        {
+ p2 @, S8 l2 N                read_MSG_buffer(pshreRAM);
0 F& h! B( h$ a9 x0 j! v        }               
3 P+ N  m$ y6 U) R" _! }}* a" L9 V6 v# R! j; E

8 Y/ n0 N  t5 ?; L1 q4 B- b- Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 w* n' ~- G% i$ ~9 Q' a
{
& t  U2 V% N) d% c% s1 u# Z6 U1 t8 A        RX_MSG_PROTOCOL buf;
. J/ V8 h& W$ h5 W        
8 ]5 i" U" d3 p' U$ s3 P$ v        buf.a = pshreRAM->a;( [& q/ r* K; D) e, g3 T  F
        buf.b = pshreRAM->b;( X: J0 y! c& c" V2 d! p" o0 j
        buf.packet_cout = pshreRAM->packet_cout;
+ f, j, G% @* e/ B! t        - |9 d, u7 x9 e  A8 y0 v0 C& R4 L' t% `
        if(buf.packet_cout != count_copy)
2 _3 a6 s' ?2 Y- J* I" t        {, r( X* N. O2 ~. ~1 b( I" ]' H3 t' o* U
                printf("a is %d\n", buf.a);7 [5 z4 `- c$ r: m9 r4 C6 _  D: K
                printf("b is %d\n", buf.b);
) F( m- b. P2 T: d0 W( W2 T                printf("count is %d\n", buf.packet_cout);
; g' i* ^7 }# w  J                count_copy = buf.packet_cout;# @+ s- r0 f& t. r5 X
        }, M4 ^' P( ~* H% B1 e
        else$ t5 i2 ~2 Z1 N+ W
        {: x. z4 t- `( t2 s' p* A) J
                printf("No effective message!");
  k0 |: Y( d$ }, [# T% g4 P+ y( Y        }1 K2 }+ V1 S+ X$ A% e8 y3 c+ Y
}6 Q6 B) N3 t. \; [. Q' `4 _( E

; ]1 N4 D+ r" E
+ K$ {! o( _: h) j- H: M( B但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
$ z2 h3 C: D% @# `& s: N0 M1 a使用下面代码,对内存使用了mmap函数后:7 Q. Y! y- w; |( G7 R0 L% w
#include <stdio.h>7 n8 d1 y) M, ?, m; T
#include <unistd.h>
2 Z# T* o: u: `; T2 V, _( P#include <sys/mman.h>
. Y4 p# u$ ~6 l$ k#include <sys/types.h>0 B; v' }; c# u$ u4 L$ z6 T+ [, _
#include <fcntl.h>" A- B, B, h! u4 H, _! D
5 I  X5 P4 A2 g; |5 J- a: U% q
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 O8 y' u! @% @3 C. E8 }& {- a4 U#define SHAER_RAM_SIZE         (0x20000)   + q/ T! f& _5 V8 H& \0 `3 {  n+ S6 s
/ g# r" U# K; f) N+ ^8 t9 H) J0 }
typedef struct! t/ ]" y- D0 a! S% T3 i( C; B
{
+ a' i; Z8 _% q/ ~# f        unsigned int a;
6 X6 u% `  K  _6 D- J* s/ g        unsigned int b;
9 J% @: |7 O# [        unsigned int packet_cout;# N" c- a- R3 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 r$ w( U; e" {2 l1 W8 i" }

& P+ @/ E& h4 J- g$ x* Jvoid read_MSG_buffer(int *baseaddr);" x6 N* H5 w; `3 Q7 ~
unsigned int count_copy = 0;4 f9 a" P1 _) b( z5 }9 d: Z

( }) y4 P/ n" Q: h! pint main()
# s5 M# Y& ?0 ]5 \{
  t* u+ u. x7 _5 `- H% ]        int fd;. c- I0 o. ~( Y, w4 ]1 B- u2 N
        int *mem = NULL;
0 y2 i3 x3 ~' T# X9 ^( K' c
( U. q, `7 }4 G" Y! `8 R  s        if((fd = open("/dev/mem", O_RDWR)) <0)- M& Z$ K5 R/ Q
        {
9 E( a6 J, x8 U3 z5 s                perror("open error");
! `% L2 s' N% v% h. O! n                return -1;* r( n: s$ y* |* }; R* {
        }6 @" v( v9 u  Q* a3 \% g2 T7 K
        
" j/ o/ N4 K- Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) K5 k3 Z7 l" b# G" r/ f
# A/ {( I' u; G" d  n: L        while(1)! h6 J( A( K) x# {+ H/ {: ^$ G8 B: m
        {
  `0 d  t8 s2 M) h                read_MSG_buffer(mem);
+ S/ {. ~7 o- G        }                6 }9 V* S8 e3 T& _. M: I
}
8 P3 p8 }2 |) q4 {  L4 {7 N0 k7 h( \
void read_MSG_buffer(int *baseaddr). o/ j) e+ N- h$ b8 j
{. t; z0 D) g! t( H/ ?* L; V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: @+ a4 v) B4 R) f5 G
9 ^! T0 T3 B' G; a) n+ b        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
9 f# |% g4 D2 w- J7 D
1 u1 f+ ~* i$ u& C        if(pshreRAM->packet_cout != count_copy)
' e6 L, e) M- ^+ ^8 f        {
8 L+ x4 i- @2 F4 y2 k2 j                printf("a is %d\n", pshreRAM->a);9 N6 z& |# t& D
                printf("b is %d\n", pshreRAM->b);
, \0 B* s% Q% N8 ?$ M$ x                printf("count is %d\n", pshreRAM->packet_cout);3 Z7 R; P& \. b5 H, ?! k
                count_copy = pshreRAM->packet_cout;$ s1 p( w# V5 {) y  R1 Y" S. \# C
        }
4 ]! ~; [$ F" ?' b3 _4 L        else
/ |7 d" F$ ^. W. y6 a        {; h1 L* w0 Z: y3 w; Z; O& {
                printf("No effective message!\n");
+ ]+ j1 q. c& @0 j4 `. N4 D1 k        }
% ]- M  g$ o* t* T}3 E, {3 g; e9 d, o2 v; E. z

6 J7 ]" d; r4 i8 ~8 b( Y8 {$ Q没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 b1 V7 Z+ l% L# W! F" N
3 X; S. P' j2 G& I# p" |

* f- B7 }5 |7 Q+ e  ~+ ^
# `& i8 r) j3 N. R6 \1 W: v& B4 ~0 O  _% e5 w. r9 h9 C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 19:37 , Processed in 0.039012 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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