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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; o; }! L( c1 V2 _2 N4 X5 e+ k- b! b" U6 U  ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% N& q) g4 ]& D) G7 @  z: @
#include <unistd.h>! h0 v4 q8 a. d$ E  P0 X; g
#include <sys/mman.h>8 \! I$ ?0 ~' R- C/ ?! v
#include <sys/types.h>
1 N. t9 V! ?" K7 S6 T& b, B: F#include <fcntl.h>( y7 z5 n6 o& Y, {
. ], f% y+ }) A) }
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( u* B8 H; y$ z$ Z9 `( d$ ^
' O0 O* I8 K7 }2 @) V
typedef struct
$ W- b; @, Y( I. s; l+ n{% |) _: h- C7 r( |, P
        unsigned int a;
' {8 x0 _4 k) C        unsigned int b;9 l5 {7 @) q4 B; h( Q! B! T- a
        unsigned int packet_cout;0 a  g" z1 c6 p; s& r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 A4 o, b8 m/ c2 l
! \) R4 [" |9 u0 Fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) M% i' Q) S3 e3 v9 p3 u4 X7 Zunsigned int count_copy = 0;! `% G, e1 f3 ]0 }  h7 j
- U( E8 ?5 }) N4 O. o- _
7 z, C& U8 C3 ~2 S" e
int main()( ~4 o9 J4 T+ g1 ~' _( [3 I
{
8 m& ]" c+ a: R' G, J        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 m( H/ s- [' H        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 x5 v# B' p- c0 r! I3 ?1 ?
' a5 w) q# e5 `0 Z5 N, k
        while(1)# Y% u7 d8 E5 \0 S3 l
        {2 H9 A/ Q9 X/ v/ T/ r
                read_MSG_buffer(pshreRAM);
2 R7 h: l  }' S! F/ G% \        }                / P" A! ?' j7 _! q7 f
}( _( }$ @% ^1 Z( z) K2 r  s, Z

2 [3 J( l5 B0 S' h' e1 Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& K. V% m5 v( j+ l# n; z{
2 B3 m/ \2 |3 ]3 ?        RX_MSG_PROTOCOL buf;" r  L( }/ O4 F& _+ L# o# q
        
6 z* `; I$ M. y+ z        buf.a = pshreRAM->a;) p# z1 F( j7 v" C! j* V: j. h
        buf.b = pshreRAM->b;' s) z% z3 h9 ]- L. [' X6 y: U
        buf.packet_cout = pshreRAM->packet_cout;6 x1 C5 x3 f, |, ?# ^
        & s4 |4 c, `9 N5 J
        if(buf.packet_cout != count_copy)
8 M  u6 Q2 J* D* r: \        {
$ ]% ?& o, t; K% |                printf("a is %d\n", buf.a);4 p/ @9 {" }  C( H& Q# ^
                printf("b is %d\n", buf.b);8 z& j( C. L2 y8 m7 A
                printf("count is %d\n", buf.packet_cout);  Q- H4 G; }  x7 D( L. p
                count_copy = buf.packet_cout;
3 u" U$ V* M" I6 i. ^8 m# a0 i        }2 s2 `9 G3 ~, n1 }- [, i# [
        else
  [; t( R9 }5 c7 E5 T4 I        {( t8 J0 b$ C' ?1 e
                printf("No effective message!");) r  G7 {& Q7 l# B! ^/ L; W
        }
# p7 S, M" T! K; m}1 p% b: m9 x! S
4 l8 Q, L/ Z% g- ?. q

" w. n2 _7 g  r! T4 R+ q/ C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。+ A: E' o% T; c& p5 }4 W
使用下面代码,对内存使用了mmap函数后:
2 L1 T1 C4 I+ e+ c#include <stdio.h>, V) q  _3 x6 K, A
#include <unistd.h>
- |* n8 d4 Z* ~4 i% ?#include <sys/mman.h>
5 ]1 W$ y! Q, f0 s) `#include <sys/types.h>
" G6 z2 c2 A) Y) E/ z#include <fcntl.h>
0 K8 R' ?: j9 M. n$ Y
2 `* l2 q. K, V( d1 W  Q/ d#define SHAER_RAM_BASE_ADDR    (0x80000000)
: G& u4 u- }# |2 t6 n#define SHAER_RAM_SIZE         (0x20000)   
$ \% L- k9 `/ {* d) S, {5 ]9 v3 T6 Q( r/ j" \; g: \# B) A. r
typedef struct
$ ?# {* t2 M& P% X3 {) J{
9 S: p6 p) n* Q% S; i3 a7 O! x        unsigned int a;
6 b2 W+ m- _0 }6 H8 j6 }        unsigned int b;6 e- `* S4 Y6 |7 t
        unsigned int packet_cout;
7 e4 S+ B, B2 F, Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' {! Y2 ]( a) I9 R3 V5 v# I, |( Z
  c# p* y1 ]  r" N0 a: P
void read_MSG_buffer(int *baseaddr);2 h9 Q4 i# M- J! x+ _& [* t/ o3 E$ q
unsigned int count_copy = 0;
9 A9 Z* V: }- e) I: R" @$ T  P$ p- e( x; M* Q9 f/ o# n
int main()
' P. N/ X$ P1 r. a2 `3 |. k7 i{
- ^/ B8 u4 q+ C( a: ?        int fd;
6 i# S+ X7 q/ ^# z; w        int *mem = NULL;% j1 q  `' h5 [

0 ^/ @% B; x! c: |4 F        if((fd = open("/dev/mem", O_RDWR)) <0)' d6 Z- d* m  l5 u* f% T
        {( j7 t: z0 e* o) d8 d
                perror("open error");
( i8 C: \. S4 n# ]" o/ s8 y+ J/ w                return -1;. o( x* A* o$ @! B1 R- g
        }' m7 L5 U- L) o* Y. g  Y
        
# U$ A  ~# X( Z' a) E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& T* Y% ]9 q+ @

) H2 P3 q' b- o# Y5 g        while(1)2 g/ p8 `% M3 W) X, s1 J
        {; B1 r9 ]2 x$ k( V, k
                read_MSG_buffer(mem);
8 R6 g/ m6 h- B) z/ k        }               
4 ?7 e: P3 w& l3 K( u1 j( u}
- l* V* ]8 z0 s4 W% y: f, w
8 I+ ~; n) A4 B& wvoid read_MSG_buffer(int *baseaddr)
/ R+ E0 z) x5 B" `{
3 S% x3 L: s8 j, T        pRX_MSG_PROTOCOL pshreRAM = NULL;7 L- T+ x# O6 B6 A; @5 T: S0 m2 a

2 F3 y2 R! G9 O7 \* h: g- a        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;7 C( Y2 S9 H$ @1 n7 f0 n

  r. B6 L' ~6 |2 V2 [& u        if(pshreRAM->packet_cout != count_copy)
; a3 d% ^% W' X$ p9 K        {
' b8 _/ `! b9 j                printf("a is %d\n", pshreRAM->a);& Q# \. Y# Q+ [$ k
                printf("b is %d\n", pshreRAM->b);
' @7 F7 d0 S. U, g6 W                printf("count is %d\n", pshreRAM->packet_cout);
1 u2 Q- k' Q' g1 d, Z# {: T                count_copy = pshreRAM->packet_cout;. a4 j! s$ F: K2 G
        }' `( a9 q. ~0 J3 V7 i; h4 h" z% [3 H/ |
        else
" A0 `6 T6 S' P/ W: x# Z        {6 S) w( [! x  v3 e% s, L5 S* _0 k  n8 w
                printf("No effective message!\n");
0 j1 E% q/ r& C5 F        }7 l2 g, d9 G3 g* Q0 y
}  Y% m0 S5 y$ Q$ `, B8 k" C4 y
1 ~: T, F  N- J0 S6 w* K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  O6 V" ?0 M, \7 B* t/ f
) G+ |! ^* o/ a$ y9 ?

5 s& b3 D: K. O6 e7 |, Y# D2 ?; R7 P3 \* m% l1 ^

1 X$ R! B% m: [6 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-7 07:53 , Processed in 0.046025 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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