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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + W" V3 r( c/ I( e% A6 D8 _
( A9 S0 \  Q- X. \, v0 v5 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 @- \* {7 s+ S) k. \$ E3 U, S#include <unistd.h>! [2 o% n# B) j/ B
#include <sys/mman.h>
9 }6 _# i' C) y% X; U#include <sys/types.h>
( u: ]! q1 n  `4 J' [; F#include <fcntl.h>
+ N" M2 }5 ?& c' e* u) ~/ Z% M& c# Y/ R& t5 @  `' ~
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
2 V0 O7 F2 \5 [( r; U  x5 S  v: ]8 J% f1 U! _
typedef struct
- L3 }6 t5 g9 @, T{
4 A8 S7 }6 I" n( u5 G; M        unsigned int a;6 S0 L0 j) ]( r4 y5 {
        unsigned int b;
( z, V: l1 m7 f+ o        unsigned int packet_cout;
+ {$ s7 O$ j5 B5 {" b# V3 R1 r- l2 Q9 J}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ m8 X% P+ I+ W# P. a( I
) ]' A; p! T; i3 p7 _" @: ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ q. J# ~- `( K2 T
unsigned int count_copy = 0;% G3 T0 `. x& `: ~

" s3 a- w; L, y; p6 j9 Q8 R% E% d2 d
int main()
# Y3 A" Y6 B* i! ]+ ]{4 R  }/ h* Z, \" _8 r- d- C. i+ B
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* U# n3 t8 @/ G. [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 A1 z  D! b$ U+ d* u: F
4 v6 f8 Y. j7 d; |% l; b        while(1)
6 }7 z! R/ o! \        {/ [7 E5 M7 ^/ Z; [% o0 t
                read_MSG_buffer(pshreRAM);: u6 Y! w$ ^# Q' u- [3 U
        }               
0 Q8 r# n1 X; Z8 x* I}
! e% ~6 A5 r) s- j6 N" S7 o1 _) }" Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
' O/ f" G9 q+ G4 m- T* x{
) F8 x( h" O2 i+ r        RX_MSG_PROTOCOL buf;
5 j  `4 r8 i- o+ x' |5 d: P        
$ g* q3 q& O2 N1 x6 z) N        buf.a = pshreRAM->a;
# q6 P- ]( L* Y3 s1 f        buf.b = pshreRAM->b;
0 P7 [$ w: I- b  Q( b) J6 w        buf.packet_cout = pshreRAM->packet_cout;
3 ]' J# j( m8 |( F& f, q5 L; R        
7 T; X! L2 S9 G        if(buf.packet_cout != count_copy)$ i* J- E: K9 v' B! q) ?
        {. b' G6 G9 g4 g# K9 L6 F" Q9 j
                printf("a is %d\n", buf.a);
  v8 A# A1 {& X$ P, \7 q) h  X                printf("b is %d\n", buf.b);' C/ ]3 B  I' L' s5 k- j' q6 b& {% D
                printf("count is %d\n", buf.packet_cout);& \& R7 ?( O9 r0 B& H, m0 y. D
                count_copy = buf.packet_cout;# x+ N1 d. E$ \) r2 @! w
        }$ }6 Y4 K5 b& I* [* C$ |
        else
- u5 i& Y7 m2 e" F        {0 P# u+ p) X7 R
                printf("No effective message!");
4 D& J: V7 O+ F9 A7 Z- X6 ~        }- D! I2 B) L7 Y5 p
}
4 y# k$ F* ]( g: K1 v7 Q1 z4 i$ ^) e" n/ r: X
! }5 \3 O" b1 m! b  T! K/ \* E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 R( g0 ^( V1 D% N& x6 G! T  [& B
使用下面代码,对内存使用了mmap函数后:* P+ C  J: F" u7 J9 m9 ~+ R5 {
#include <stdio.h>
1 B/ }" h- C6 S  [8 j#include <unistd.h>! G& L" n  Q4 W) V6 B1 z7 U
#include <sys/mman.h>5 W# ?5 ^8 t1 {) s" ]8 W; B
#include <sys/types.h>1 j3 o+ E2 `3 m  Q$ }* N: C& i
#include <fcntl.h>
- C* D2 F! a( A: N; I4 v$ j, F# k/ X* }" I9 g* n
#define SHAER_RAM_BASE_ADDR    (0x80000000)6 g0 O1 \% @/ Q) I
#define SHAER_RAM_SIZE         (0x20000)   0 [( J( u" F% J& Y, l5 |: Q" i

& v7 f8 R% R7 V7 M8 r/ d  Ttypedef struct
' A4 ^5 j" n; C' Y' [8 J; {{. m& c% d' p" [+ q
        unsigned int a;  u) O8 Q5 Y$ l; A" ]3 v
        unsigned int b;
. d9 \# S( ^, s        unsigned int packet_cout;
' d$ S8 z  h. A. W6 R# s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, r! R) X# S: M2 ?7 F4 @

( Z2 z& w  O4 a* \void read_MSG_buffer(int *baseaddr);' L  t$ G0 [. V8 }
unsigned int count_copy = 0;/ d: u$ l% x+ h! M* w' z2 L

/ A+ z; D9 X# z# h# iint main()
# c7 g- c' p5 n/ y+ A' ?{
* F; h! |) G/ C/ r/ |9 E, o        int fd;- g; f' ^4 @& R3 M" ]
        int *mem = NULL;) `; F( L6 G8 f, {6 C9 c8 E

; p% m3 o5 y" y  N7 q; m, x) x; b        if((fd = open("/dev/mem", O_RDWR)) <0)% L$ r7 o8 [5 }9 z
        {9 b4 E( f$ a, u3 r
                perror("open error");
0 s* U* F8 x# V0 w: M) t                return -1;
4 m& j! _: Q4 v+ H7 Z2 E; x        }; I3 o' A2 ~/ T' c
        / V( S# g7 H* g
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
0 \, G6 A! h+ j& Y  t2 \$ c  h3 r2 V0 f7 t+ x3 [
        while(1)5 l8 G9 Z( I  @9 w" _4 q
        {
5 p+ \9 m( y+ |' {: O) H                read_MSG_buffer(mem);
1 j1 a$ V# T7 u        }               
7 r" \& \8 M9 n! t! j}
9 |! X7 P; c+ l' s7 V. V9 O) k# r0 ]( {8 T3 P: y1 y% V) v
void read_MSG_buffer(int *baseaddr)
; Z- Z/ v2 p3 b, `3 g8 y{
* W4 I: ]/ C* {6 ^* d+ f        pRX_MSG_PROTOCOL pshreRAM = NULL;# n, S: y; n& d* h; F% P3 G2 P
" c$ R* k- Z; [2 G: {+ @- ]
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 ^$ [, @0 s9 Z% A( l  j$ @

7 T7 i+ D& E. o' V1 D: k, T7 E        if(pshreRAM->packet_cout != count_copy)& J  Y2 i$ j2 r# b2 [, S2 p
        {: y9 ?) b3 O8 ]# \$ H
                printf("a is %d\n", pshreRAM->a);
( ^4 e* W/ H+ A% U; `                printf("b is %d\n", pshreRAM->b);# O4 `* g/ |0 G8 O" _& {! I
                printf("count is %d\n", pshreRAM->packet_cout);
0 C- x" T7 q9 E& L                count_copy = pshreRAM->packet_cout;
5 T$ h! ?8 D; i        }
- g8 D# {* }5 L; b! n; F        else
$ d: ?, M" K' e7 I        {
7 a* r8 J) w- X9 R                printf("No effective message!\n");
* X( B; F, c  W: L- `6 i: U6 R  ^        }
) c. D; C* i# ]: [: _# C8 H}3 z% \& k" |8 Y# r' k$ A6 f- P7 D
5 M4 R& C8 C* h5 p5 R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% E/ r" R" u# x

! d2 [8 x9 [3 Q/ ~" j& x0 H& W. l. U* j# i+ s/ e

. I1 A" u. ?+ z
# |9 D9 a2 F$ j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 02:27 , Processed in 0.037976 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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