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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
% h' F. R8 V1 i0 N: J2 Z6 w: c4 G! B) }0 R- c0 ^  r
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 p+ |- C" ^. l#include <unistd.h>0 F, u2 R# V) R  B9 r4 ~2 a+ U
#include <sys/mman.h>" q( ]0 o6 R% V$ T
#include <sys/types.h>$ ?; A5 G6 i& V$ {2 T. P
#include <fcntl.h>
3 p) p& l) [1 f5 R% w
0 s. }: t% `% c1 ~7 P#define SHAER_RAM_BASE_ADDR    (0x80000000)   - P4 t3 [1 Y+ ?9 e
' ~5 R; I) C  b4 I- i
typedef struct- o' e8 @7 d' D! ?8 b5 |" Q4 R( X
{5 R" ?8 s. j' C" i% \9 o( g
        unsigned int a;
' r# u0 p  [( v5 j- h7 q        unsigned int b;6 e6 f) W: ~+ Y$ J% m3 U2 S
        unsigned int packet_cout;( I% P9 o& W. ^. ^3 W/ ^; Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  Z' n0 W! j( B* d0 K. i/ o% w
% D7 q; c. k  v# b7 Y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 u2 I9 \* h6 f# Y: g1 X2 F
unsigned int count_copy = 0;) f) A) K4 }# C% }) ]) U
/ k+ Q7 g% I$ M! ?3 r2 P/ ~! o

( {; F3 u/ \* t; ?3 c9 Bint main()
. E  e0 c( d* i) n7 J' [' b{. w# \5 H" q0 Y2 Z! e3 O
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ {" |2 G+ O$ J3 S  R+ Y/ Z! a4 X        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;- k3 H8 N; T. f
1 _6 A+ i( }+ @
        while(1)$ M( X5 o$ g/ d) ^: r' p$ e
        {
! M8 w+ `' }2 t; v! O+ ?                read_MSG_buffer(pshreRAM);' T. \. r: b$ e, I- k0 N$ T
        }                5 R$ ~1 G5 j5 N% }- O5 \; F
}
: d4 W" H- M4 i2 w- P5 N1 ~# x4 _) h8 T3 A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 P. d+ Y9 N8 \8 B, S; x: a
{
: z& W* ^% y4 D* W7 D        RX_MSG_PROTOCOL buf;
6 i& q) Q" k/ n' A. e' c        
& l. x+ d! Y; h; b( {: @' {' B) Y2 M        buf.a = pshreRAM->a;2 c) A; [& R) f
        buf.b = pshreRAM->b;
/ s! u5 v/ ^3 p9 {: A+ r) {* N) Z        buf.packet_cout = pshreRAM->packet_cout;3 i8 c3 m8 e! b4 d$ D. d* \
        
6 |- B" x2 u/ q& L- o        if(buf.packet_cout != count_copy)& U. d0 s9 v+ o$ q+ H! a2 C
        {
1 l/ F* H- a/ W% ^; s. n: x                printf("a is %d\n", buf.a);
+ w& C; C; b2 s$ i- u1 S( l                printf("b is %d\n", buf.b);7 s$ l  R9 [8 [' ~; e5 o/ G4 f" R
                printf("count is %d\n", buf.packet_cout);
8 c8 R+ r1 [& o  ^                count_copy = buf.packet_cout;
/ f$ K+ |2 @/ c        }
: }2 J7 D6 w9 q6 G, \6 D7 E        else7 d1 I+ u+ Y4 [9 f# F& z
        {3 J: y0 D# e) {, W
                printf("No effective message!");
$ Q8 f$ o+ @* K1 O        }
: Z  V* ^/ q1 \}7 n% `1 d! m& ^; i6 E" W

3 \( }8 Q2 q  W- t! e) W- P8 v& ?
# x6 ^  e* h; z% d但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: E- J5 n3 r6 ]  h
使用下面代码,对内存使用了mmap函数后:6 S: |9 P3 N! h1 J8 [' S$ x
#include <stdio.h>- T. ?& ^( Z. {) _0 z' Z' C
#include <unistd.h>% r) R/ m5 B+ h& w0 n6 Y  I; Z0 b% }
#include <sys/mman.h>* K# d5 H1 R0 O2 m% x  @
#include <sys/types.h>
. y7 m) w& c8 F#include <fcntl.h>+ x$ ?; `3 ~, P) p& {; f

- g; s9 o" j6 K, k: ~1 r+ ?#define SHAER_RAM_BASE_ADDR    (0x80000000)
. ]/ r/ e& a+ n# s3 `4 n#define SHAER_RAM_SIZE         (0x20000)   / S5 U) {9 G; E, n
& J3 O7 E, v! z. e
typedef struct) D) F* W- q8 h0 ]" C! d/ C! J' B3 S
{
$ Y2 s, q' ?% L        unsigned int a;; R  P1 w/ z' z* }& ^  h; L
        unsigned int b;/ v' r% o9 u0 E9 ]2 X1 q
        unsigned int packet_cout;+ s* v8 h$ j0 Q0 G. h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% Q' t6 a1 x/ l. n/ M* h, m0 V& Q2 Y7 E" X6 c5 D- y- V1 O
void read_MSG_buffer(int *baseaddr);9 ?8 o7 f$ r7 L
unsigned int count_copy = 0;5 a- z5 G$ c3 F5 j

. f3 \9 L* d/ v, l- ]int main()" ?# d. i  a) i; {
{1 O5 H2 I2 S1 e! ]
        int fd;
# U% Y, w( ?' z5 l- o        int *mem = NULL;4 h$ U4 D, l9 z& m8 U: E+ Z; |5 |2 v
7 W; j4 n% k/ E; Y, D0 v" e
        if((fd = open("/dev/mem", O_RDWR)) <0)5 V( X( y8 r# |; N; B
        {
" ^8 J: a: ^2 Q; B                perror("open error");
/ X, Y3 J+ s, N( `; y" ?$ E- ]                return -1;
* ?* l0 e  R" Y( P1 g. x! F0 y; A7 D        }9 n2 {" _& `0 P: Q, t
        
  Q/ b; D; @8 s. b) ]3 Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# W% f" t. B- [

0 S: ~% V& e* `0 s% M' ~        while(1)! y+ ~" o. F& n$ e
        {
( h3 J6 x# s" r: k) g* |- Y( P                read_MSG_buffer(mem);
' v( j. Q7 y8 [4 [7 U7 m        }                1 d4 D' O( l, D
}
  V3 ~; Y2 B, D, l9 N" I
3 y9 ~+ X1 H$ w2 Q! evoid read_MSG_buffer(int *baseaddr)
9 i7 V- V" B! F/ K0 b4 I1 R; ]5 m' ^{
9 k( y  c1 i  h1 P! T0 S- w- l, ^/ r; q        pRX_MSG_PROTOCOL pshreRAM = NULL;0 W' s2 {" y3 h) u/ I- ]
% }4 r/ M( {% M( k
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; B0 w5 t5 G6 r& V$ E$ {6 ?# s! S! b& g( `# [
        if(pshreRAM->packet_cout != count_copy)  v3 `6 C5 O; m) A% F. \  d0 f
        {
) p- m) T/ K; O, b                printf("a is %d\n", pshreRAM->a);6 T% S9 K) b6 \# @
                printf("b is %d\n", pshreRAM->b);
& N* w6 H8 Q( J6 G0 F* @                printf("count is %d\n", pshreRAM->packet_cout);
) J) r/ c  H* R. ?  _  v2 y# [6 L6 v                count_copy = pshreRAM->packet_cout;
! s2 F5 \/ I5 s4 }  I        }
0 `) T; t1 ~1 }1 {  X+ @        else
. E$ S& ^9 s# g0 V        {% }  a- Y: \6 G. l! T5 M
                printf("No effective message!\n");, {) L; I9 f8 W+ K1 H
        }9 s1 J+ ^$ @5 ~( |2 E
}9 ^3 }4 f6 h4 P0 q" Y: Y
8 @+ C( k; y' m9 E3 ?% X) t5 {  E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. X9 r: `. n$ k3 [
% m( C5 I, ^) j  N. T) P- w& q+ w  N

9 i3 u6 w9 q* Q0 @* h. h
) M' v3 I2 h+ E! l5 z9 C: \
1 L9 R9 u& C( u; H6 g0 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-2 11:57 , Processed in 0.039962 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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