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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 E  L* ~$ i) g

  {; s% C' b  H, G9 fOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 X' B) d2 C! Z, I% ^- U
#include <unistd.h>
* F, G+ S/ A$ k- E#include <sys/mman.h>
. y6 J+ v7 h. s) j#include <sys/types.h>
1 `: Y) l7 n4 G5 \# p! y#include <fcntl.h>$ I9 ^5 P( e; D
! m+ U% `- }4 M
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % g4 J3 d. N7 m- {9 v  n  b

4 w2 \/ x0 t8 N$ Ptypedef struct
( y$ p/ c" ?0 Y, E' R% C; C% ]{
3 R' I5 z: l' [. `1 t) G1 ~2 k        unsigned int a;6 t2 U$ w7 C. R! r% I4 z
        unsigned int b;+ J& I% a- D1 G* L
        unsigned int packet_cout;! p: T% X$ s% i! `7 w: S  _6 ^# c
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 s' i! k1 M# w' L4 p- I' U8 _: I9 ?: l/ Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ h/ b' m9 V6 ~7 I' m) {) B
unsigned int count_copy = 0;" _5 L( t# B& I8 ]1 x; I6 }

3 d" C' p6 x; S3 ~' g2 S) Q3 L, S# L
int main()
' ?- f/ q3 n: C3 h4 g{$ |3 a8 o4 v! F! T3 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 h4 {+ {$ S* Q4 K$ i# Z+ G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;2 [5 T+ \  a$ w* ^9 e- f7 j

2 w% \5 ~5 f0 I+ g; F0 {        while(1)
6 C2 S1 H1 I8 ~9 o+ w        {
4 \/ E0 M5 J/ B& \6 q1 Y                read_MSG_buffer(pshreRAM);
7 |* v8 z" T6 E4 \) S        }               
1 _! {# ~! W8 M3 U/ Z: D. }6 [& V}
% O2 l3 h. m: Z. T9 k0 m8 b+ ~0 l
& s# J& S- ^4 \8 R; C, |; w8 lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" `" }, {& s1 R( Y! m8 {0 t
{
6 V& q1 C6 j' a+ r" g  g1 ?        RX_MSG_PROTOCOL buf;0 ~( U) ]" d! }
        - I" X+ |: r( Q: \" e4 h$ G
        buf.a = pshreRAM->a;
. d; P7 y, l+ L  \* E, t        buf.b = pshreRAM->b;
4 D# p* t- A- [/ H9 \" c" z7 {6 H. J        buf.packet_cout = pshreRAM->packet_cout;! g' z" X9 Z5 [: X; j; ^
        
1 ?! y/ k/ x; T- _* x$ K& \        if(buf.packet_cout != count_copy)
  k/ Y; h, z" V9 h1 ^, D        {0 J6 R5 b& `  O# ?
                printf("a is %d\n", buf.a);% u/ d) {/ l: Z
                printf("b is %d\n", buf.b);% Q7 l( E9 [  @- A" T
                printf("count is %d\n", buf.packet_cout);
1 C6 @, f- V' j: X                count_copy = buf.packet_cout;# d% _" J- K9 ?; z. ^2 v
        }# j' Y. B8 M# B) ?" U7 T
        else
& V6 u7 m' r& o6 L$ M% n        {9 }! \% R2 E- L$ Q9 g
                printf("No effective message!");
3 r& u. V6 ?) l0 w        }0 u5 F! f  m! X( l" {1 s1 e# a3 S
}* U* _2 V+ [  X! b

; `. H$ @0 m3 M7 m& C8 P# G6 u! D9 ~1 O
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 E; x* z" t6 n2 s# x' B使用下面代码,对内存使用了mmap函数后:
% }  H; Y. E% m3 m#include <stdio.h>0 m0 F3 N3 g' ]
#include <unistd.h>! W9 q+ f# h2 s; v' h) v
#include <sys/mman.h>
- Y- Z8 Q; V* ?! ?7 R8 J#include <sys/types.h>
+ C* o9 G  j' P8 K! T7 i1 B. |#include <fcntl.h>
0 r  `  P9 Y: b$ v* j( v% g  r- c. }9 k) ^
#define SHAER_RAM_BASE_ADDR    (0x80000000)( K& r* V) d, d3 P6 ]! f* G
#define SHAER_RAM_SIZE         (0x20000)   
+ L, b: |* _; y. W  ~
; X* V% l- r5 Qtypedef struct! j( a5 _- v4 d. W: q1 f
{8 [: x- P. C! e  J# R  H/ r9 d5 {+ R
        unsigned int a;7 }6 R0 ]& K4 y  ?4 V* |# X! R
        unsigned int b;: Z/ c& s, ?+ S5 V6 @8 M
        unsigned int packet_cout;
1 }$ g+ Q- f, |- o& h}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' W6 r; T5 B) q7 C2 s+ A) g* }; s' k& J) M# n8 p- u* Z+ j2 ?
void read_MSG_buffer(int *baseaddr);- M" u7 V; A* K8 V+ a8 M: `/ i
unsigned int count_copy = 0;8 S: N, ~5 Z! v) @5 ?/ a+ N
/ S9 m  N% z6 C* p0 v8 e" i4 N7 m
int main()! T6 z' \+ I5 x3 j) I9 y+ ]0 T
{
9 I3 x" Z" P( a) o* |: y+ K7 c9 j( v! ]        int fd;5 }4 J$ \! ~6 Q8 A3 ]
        int *mem = NULL;8 l9 r" b: y+ Y2 ]. o  e

# z- g/ G+ _+ a  T  j7 G        if((fd = open("/dev/mem", O_RDWR)) <0)( L) c9 j4 k& f* m/ O2 y" T7 Z1 x
        {
! d5 y2 X  p2 \0 `" `+ S                perror("open error");- A0 x/ t0 \/ y( P& v
                return -1;
: u4 _* t* i! o1 }& Y; e        }
" h! @4 A$ U" R$ c; z" Z- z; _        - ^" a' r* M' P& a3 n4 |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 _: o% `6 J1 P% o: C0 D
9 B! D$ ]% P2 E        while(1)+ T% H' m+ ], v4 V
        {' I- K6 }/ x# O- T; q; z
                read_MSG_buffer(mem);
% k, N) z; j1 A1 _! }3 b2 B        }                4 ~( _- f0 }* g( t! {
}0 U$ x' j) M! _' y6 @! }$ r1 \
0 c- p' M* s3 r! H
void read_MSG_buffer(int *baseaddr)- u% a8 [1 R2 ^3 A" E$ e
{: j" |; A% }3 F6 _) o; S/ t
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 _. m( f: c) a0 k8 ~- \: T! {, `! _4 B
( s$ f- z. L- ]/ B; r9 Q+ ?
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  W5 K2 _& \/ u6 o; v
8 y# o+ e! r% v  k        if(pshreRAM->packet_cout != count_copy)
1 [) f" L7 b" G, |# C% _7 L" a        {, w% [& f' O) j8 k4 E& t5 D; B
                printf("a is %d\n", pshreRAM->a);
7 Z0 j- M0 v7 v7 C' J3 y9 d- v                printf("b is %d\n", pshreRAM->b);
) J3 ^! Z; x  J  L7 l4 O                printf("count is %d\n", pshreRAM->packet_cout);
7 d6 n+ U' \8 [% t/ H) |% w                count_copy = pshreRAM->packet_cout;
) f+ \$ J& @" G) N5 ?! {        }
' W& p6 A" G! }2 ^        else
  H8 z" @7 t( M, C        {
6 ~1 b6 \3 k* V7 F% d, ?4 ~( B                printf("No effective message!\n");
0 k+ ?  t6 d1 O, _2 C# I% Q6 b5 x        }) W( c; \! w. b) D  j8 v3 |
}
/ r0 m5 I! a; ?, e) z' c3 F+ D. D7 Y* `# R
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
# D4 I, J+ u7 f+ S7 Y" U* A. B, }$ q& Q; j4 i9 e6 ^2 d8 T+ l

' _. \6 k: R: \. i4 b) m
3 f3 b2 ]9 C% q- g7 G% @4 i2 \) M1 D( l, F/ {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-29 03:29 , Processed in 0.040984 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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