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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 T* v4 v$ J$ a! B& F* j$ N! L* M) q2 H" b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 c0 V/ l2 u; P! @4 d7 h#include <unistd.h>( e- p! G) }! J1 i1 ^1 v$ m$ |
#include <sys/mman.h>
+ R& |1 O0 \& Y: W0 Z7 h#include <sys/types.h>
  U; V! K, x6 f7 ^# |#include <fcntl.h>$ Y5 |# @1 E4 B2 }6 S
  L( Z( z; L; u9 K- U* B
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- Y2 X1 ?' r9 \0 S, U: D" b" N
' `6 d5 |* K! \typedef struct- T& N* l. o& R- R  E3 T0 A
{
3 A2 |0 g0 ]# R0 e2 o        unsigned int a;
( D6 Z. W( |8 r0 t9 K        unsigned int b;
5 [$ j" H8 [6 a        unsigned int packet_cout;# e% A+ {$ f6 f# _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 i$ e9 h8 ]1 [, p
1 b4 y  w, h$ }: [3 [, s. J9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);& Q+ L" J( f* H, H* G+ j
unsigned int count_copy = 0;: y# Q; F' F$ L9 ?

/ C$ d/ c$ ~, m4 R" u7 @' H5 |0 K# t0 v4 Z
int main()
; J6 i( \, s/ q- x4 Z{0 i$ G) s# ]2 ?) t% I8 Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 y- O# d1 f' ~  E2 x        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' T) F" X% M* y% h" ?0 |" F4 I

* n8 z$ [( i; ^$ [# G0 {3 `% M        while(1)4 S  p& m) h5 L8 ], @3 i
        {
7 H& {' T) t: _0 S6 r  X7 ^                read_MSG_buffer(pshreRAM);/ G/ ^+ _, m8 |8 k/ k
        }                # A% {6 y. {; W9 r, B& }6 s6 W
}
/ R2 T+ s# l  L3 s- @$ m' F
5 C/ g5 \0 @8 E5 `5 ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, E9 t0 S9 f' M" T{
7 E& v* s( a. V: C        RX_MSG_PROTOCOL buf;
" b/ D/ `1 Z5 X8 b% I% y3 r* ?        1 u1 v: }- J) w: }! y. }
        buf.a = pshreRAM->a;$ C, z; {9 t' j/ Z$ D2 p) p8 ]% v$ m
        buf.b = pshreRAM->b;3 F" x) [% I# r
        buf.packet_cout = pshreRAM->packet_cout;
4 c2 [5 D9 G& `( b; i' i        
) T4 }5 g  }8 _        if(buf.packet_cout != count_copy)  v: @9 [2 S+ s$ L% k9 K' m
        {
! J# x# t( W$ d                printf("a is %d\n", buf.a);
# K" K+ U1 G# V9 e7 }                printf("b is %d\n", buf.b);/ b( n. D9 A1 z( n
                printf("count is %d\n", buf.packet_cout);
: [& ^4 u. C& z2 X- v% @( s                count_copy = buf.packet_cout;
: _1 V# N5 {# t        }7 }: q" x( x2 a7 f1 g
        else
9 B  D5 T( C% C: v0 ]$ k3 X        {
) Y, D# g( R$ b, X  J" x                printf("No effective message!");) H5 o6 F6 I$ ?6 J* i
        }( S* ]2 ?: B; P+ l  b
}1 b3 e, x' K3 {! k& j& }3 X! l4 E
- S/ P) [2 t# F/ G! A" ]/ l9 u' ~
2 P" p5 R6 l7 h
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ e# I# H, _* M; e使用下面代码,对内存使用了mmap函数后:3 e& p" V  L4 k/ t
#include <stdio.h>
) |! s! Q* p, o8 F1 x4 a- p5 u( l#include <unistd.h>) x7 Y  b2 _0 q- @0 V7 F! Y" \
#include <sys/mman.h>
. I5 |' e) A5 X6 O0 {" o# }+ K#include <sys/types.h>
7 I' u( @# O: c9 g( y4 u! w#include <fcntl.h>
. z; |$ f! p+ T3 Z, X' c# Q
4 P+ M# w6 H- @0 y9 T5 L#define SHAER_RAM_BASE_ADDR    (0x80000000)- @2 h9 s; m8 b/ l
#define SHAER_RAM_SIZE         (0x20000)   
7 J" B, r! u; q9 x8 r' y  O* p+ z6 u9 y
typedef struct
/ G4 T* ]) ^# o% f{- \$ S+ F! L" ]8 b
        unsigned int a;$ Q/ H7 X5 @5 \1 a- z" E
        unsigned int b;
% ?- l0 [$ o1 `/ f  t( V* y        unsigned int packet_cout;
2 j! P" ?, u6 f$ c' @2 n5 d! B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 r, m6 G: x# Q1 y: N: X, D3 l
7 ~1 }9 w: N% ]  k
void read_MSG_buffer(int *baseaddr);
3 ]0 d5 ]- j. }- R) f4 J9 Bunsigned int count_copy = 0;
  X+ j  F5 Q1 w. v  c  n9 R3 _! @4 \5 F
int main()2 w, ?& \: q6 Z$ f: U
{
; {7 Q4 w. o4 w+ |        int fd;6 P% A  O/ R; X8 Y
        int *mem = NULL;7 w# z7 Z9 t$ n$ E- a- {8 g

5 u* c! N+ z# s1 a; R        if((fd = open("/dev/mem", O_RDWR)) <0)! b7 E' v7 ~! l" ^6 M: E" |  ?
        {0 L. f+ Y& O1 a8 D8 V( W6 }
                perror("open error");; Z$ ^8 b; S! a) ^, |6 M! O$ c+ r' h
                return -1;! f5 h: |. c& G% l# F+ j4 C
        }
6 ^% y2 A- Q% p  L( V! |4 S% E        ) P5 A. J7 D2 P* S5 u! ]% u. t
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' X4 p8 O7 W. Q8 R
# \0 w& A% E% f8 ^5 a- I  q
        while(1)
  B: z# q; [* _7 d4 S- O        {
- W" l- V) A3 L- u; o* [0 e                read_MSG_buffer(mem);
6 ~. p% J, v9 N        }                  o5 p& h/ k1 e/ u, i: R6 j
}! C/ `' V1 s& p

9 t0 y% z, T7 R+ L2 R, F$ G$ Wvoid read_MSG_buffer(int *baseaddr)
, s& ]$ k8 i9 i* u{* ~" |+ O7 F) W/ b9 S
        pRX_MSG_PROTOCOL pshreRAM = NULL;: `/ S) l! n4 M% L6 ~8 T

+ C/ w: c7 y* ^7 Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 J+ J/ D( m9 x/ F

4 G: o. {6 B/ d' u        if(pshreRAM->packet_cout != count_copy), b* V; u, U% l7 o6 ^0 {! q5 F
        {
: Z/ \/ _- w. V% Y7 ^                printf("a is %d\n", pshreRAM->a);
+ R2 j0 c) X; }* S, u6 C( }% A                printf("b is %d\n", pshreRAM->b);
# T5 n( W2 m- Y! w                printf("count is %d\n", pshreRAM->packet_cout);
! [+ z0 ]! [, \0 M, k" b: c6 k                count_copy = pshreRAM->packet_cout;! p9 L( W# R) @3 W: M- L0 l
        }
7 Z- c7 Y  l$ m$ N        else$ \5 k: |- @; ?! S* I& \. v
        {
. s9 n: l9 s$ B7 s. e' v                printf("No effective message!\n");
( u, i8 u( v0 c8 D2 K: |        }5 n& l+ e4 [+ k: K, e/ X  v
}0 w$ q5 o; l) a2 O8 c
4 W; K* W8 N3 c% o. x; d! b. Q* }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- a! H: w, H/ v1 i- C
; o  F* z% `  `  A3 f0 d
  w) U; Y/ Y& ~9 _7 K7 v% \% W# C9 j7 X& c4 `0 C5 L& p' ]  `" I
* a7 z( b1 M3 R; A9 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-2 17:26 , Processed in 0.039921 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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