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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& }2 o* W4 [6 U% c( N+ C( \2 @+ J: u% D. J/ c0 `6 v5 l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: _9 E+ Q" P$ Q/ b4 Z% W
#include <unistd.h>9 R/ I* D, H8 A$ O: d7 ~9 Y
#include <sys/mman.h>
% V, x' }4 ?3 K  e#include <sys/types.h>
( ~6 J5 _* e* F  F# o  m#include <fcntl.h>  N+ X7 u3 r+ m7 v0 l1 I

6 _* N4 a0 N/ z( S#define SHAER_RAM_BASE_ADDR    (0x80000000)   4 x$ O) N3 Y$ B% Q8 @" ^9 d, ]& w: y

/ A0 B& y$ u; a! f3 btypedef struct& v  F" p* q' q- W. H/ |
{
$ e# ^. c( W' x; h9 J+ Q5 L        unsigned int a;4 Z6 h; C/ ^' ^) w/ r5 F
        unsigned int b;1 Z: p* `* \0 S8 B- |
        unsigned int packet_cout;4 ~. b. S! X/ f
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 p7 Q& J& M; R* l1 v+ n! L3 [7 ]1 k  @( R, l; s3 A0 p  L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 {# M, f- {( }3 n
unsigned int count_copy = 0;
) C) ]9 b) X- D0 m( n8 Z- w. f2 _5 y9 t3 x* Z: g+ v1 P" u( L4 ?/ T) P- o
$ P0 ?9 v/ F# X1 O6 }6 d0 U1 ^; n
int main()
9 t1 [1 e+ {3 J0 F{" T. x$ }- h1 t; y$ u( W3 N
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 B2 E) }; y& z1 g7 _" f' X: ?2 g        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! ]% {. J# y- _

( A+ U$ ^2 v3 Z' D3 f; S' m  S        while(1)
2 ^1 M1 B) j9 N4 A        {
# @" C6 g, {/ n/ S8 l/ [0 O                read_MSG_buffer(pshreRAM);
3 F* j' ?/ U2 D7 r        }                $ E  e" R( L0 S3 Z
}8 r5 ~5 [6 _  K9 D6 i! n! F
; w7 Q4 L" P& B- R. _8 e% ]3 L7 P1 K- P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% t7 p8 i2 v3 \) A+ o
{
+ _1 I4 N& O# L  u        RX_MSG_PROTOCOL buf;
- T- C/ `, ~" d7 B: y        
4 w2 L( A5 I2 u2 J1 ]: ^' M( x        buf.a = pshreRAM->a;, V+ V  D; @& j2 }3 ~
        buf.b = pshreRAM->b;1 s* P$ {3 |' m7 C  B
        buf.packet_cout = pshreRAM->packet_cout;5 _3 m' ]3 M8 [% P# @
        
! e/ W( S9 [: h( i, m! z        if(buf.packet_cout != count_copy)
6 J, p" j; k; B3 t        {
. _( G0 n. s3 N9 A                printf("a is %d\n", buf.a);" @4 k0 p: ]) j* y
                printf("b is %d\n", buf.b);; I" g/ X$ o5 i0 `0 U0 ~
                printf("count is %d\n", buf.packet_cout);
" e+ ~: T% L3 M" x  j                count_copy = buf.packet_cout;" M6 I, m+ I) t
        }
+ J7 i0 L; E6 e5 Z/ i$ C        else. b/ D9 C$ {1 r7 B$ V- y3 e
        {/ w& j) ?8 Q5 _0 }
                printf("No effective message!");# o7 Y2 d" X9 T/ a: O4 j6 l& @
        }
/ C% l8 R4 A, B. u8 b! n: c' V}3 p3 A# V: ~: S; x9 X7 K" n/ h: V

: U# ~; X1 E- ?" U9 M+ T; @
& I% r) b8 J# s但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 Y! E& w7 \; k0 k, `使用下面代码,对内存使用了mmap函数后:  G6 a3 e2 h- ^1 z% c
#include <stdio.h>& V7 T& s9 L: o) Z5 t8 C6 ^
#include <unistd.h>
8 |/ W3 z+ `) U7 G, E. R; t% O#include <sys/mman.h>
6 N2 L2 T9 `5 Z3 v  R! |9 _#include <sys/types.h>) c7 T/ F2 I% z0 G
#include <fcntl.h>' X) H+ w8 [; \

! y# M; z. d( e% S#define SHAER_RAM_BASE_ADDR    (0x80000000)
" t6 c5 J; P* `# M+ z#define SHAER_RAM_SIZE         (0x20000)   / F+ n9 _( T; _. Q" q0 y

+ k% w) \3 x1 W0 k( ?typedef struct
+ [, p7 P( r4 y6 y9 u# O{9 j; e6 X& X; ]* T6 @
        unsigned int a;; f" c' L" Q! c4 t
        unsigned int b;
4 b7 Z! X- U2 L) @        unsigned int packet_cout;- u' |& h9 I9 v
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& J+ Q" q, p, y+ N3 `" f3 i; q2 u/ y* |; ~' O( m! `* {# |4 b
void read_MSG_buffer(int *baseaddr);
+ F1 G7 V) ?0 i9 L" W8 Ounsigned int count_copy = 0;' n. X; d$ t+ X6 H6 h  X- D

5 H6 g# ~+ y5 n) M3 qint main()
. l8 }3 _# n; @0 M{
/ n; D: ]9 c1 d- k( P$ S        int fd;
" I. m, j/ l6 \5 u( A& I2 m( e& _7 e        int *mem = NULL;
" Y7 g7 ?  v* q, v3 r
# ?9 E, j  C4 {5 b* R        if((fd = open("/dev/mem", O_RDWR)) <0), v! h8 y* E+ \8 z/ Y  X
        {+ \- K4 E  |5 c1 J" q$ [* _0 N) T
                perror("open error");
$ q1 m/ }0 B) a8 b( B                return -1;% P4 d% a7 ^7 k$ J+ T2 e
        }
, m6 L  o8 M/ ]) ?2 }        
5 T, `' }% R) [) I0 _3 Y9 u" r        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' [* t. @# |$ G- I6 \; W4 ?& ~- v/ P! B# Q& _, v, t! u
        while(1)1 K. j( {9 G, O% r, y) v, _. l/ U
        {
( I7 @; N, B) i' C9 m                read_MSG_buffer(mem);( X+ x( {+ q$ D: G4 w
        }                4 ?% L5 S7 e1 Z, W5 ]# f( s) h
}
8 Y! D3 L; w" j. B5 N4 R9 J
4 f( {' c7 j4 Avoid read_MSG_buffer(int *baseaddr)
# y1 J- _" V& o& {! u{
/ J( J' V3 x) ^, ^% a7 U; V        pRX_MSG_PROTOCOL pshreRAM = NULL;
% o7 _* O$ P6 m
& ?' l/ z2 Q1 r/ S2 H& B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;# R1 {$ {2 S2 J$ s, [2 z0 g. \

4 E8 Z0 U1 i7 N        if(pshreRAM->packet_cout != count_copy)
3 l; v; i1 |$ q$ X  ~; Q- Z        {
9 z3 k. W- {1 O% u# F4 p                printf("a is %d\n", pshreRAM->a);" U$ R7 N6 v# @8 g+ A# G
                printf("b is %d\n", pshreRAM->b);9 w3 U: u% {; s4 z
                printf("count is %d\n", pshreRAM->packet_cout);
. a- I3 E% I0 w8 T/ k                count_copy = pshreRAM->packet_cout;& w" S! {4 y8 w! c' s' c6 {9 w
        }9 b% l8 G, V+ {1 V( G
        else$ \2 y. l' u2 H( x; ~) }
        {( c. T4 H. R) Q) J2 u4 y) Z
                printf("No effective message!\n");" e2 [2 y- s0 Z! H7 Z  e: t8 g
        }3 b( j  v+ c* J7 y2 Z$ e- X
}
( u7 a& e5 D5 M+ @# k  ~
+ N1 Z# Y( T+ o5 v; Z% |8 F没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* D% U; n8 L8 ]- Q4 u7 p8 Z- p5 n2 x0 f  S, d- B6 J$ s# J4 w
2 \/ c0 A% `8 e6 E+ [" k
* B' i% `! c- ^, t5 ^8 i3 B6 Y
: n: L2 r0 U4 K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 22:53 , Processed in 0.036922 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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