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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' B8 ?. L, c: e( w" W6 ]  K) y; E# ?
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
2 u: q. i3 m3 C# X: ~8 ?#include <unistd.h>
& i1 f# O3 l, E#include <sys/mman.h>5 l" B9 z( h: {
#include <sys/types.h>
8 [: L1 ~4 x7 c6 j6 P1 T#include <fcntl.h>
  u! o$ V# g& d7 w; w+ Q; Y8 m, G) S6 p' B. |+ D
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' P# v' i/ Q+ g  K8 J5 o( o0 l; p  z8 k, q
typedef struct
( d% A4 z% h! L& H1 e9 M6 p4 h) ~{
9 A6 Q5 O5 C) ^: B, m0 }1 f        unsigned int a;) p: I: @8 d5 W, ~6 p1 m4 w
        unsigned int b;% ~  ~' P% A1 R  \5 N2 [8 Y% _
        unsigned int packet_cout;  j+ J+ ]4 U# k- r  z) F* w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ N' V0 P' w" e* {) c, q
6 H* [( i' N& P; _7 C1 U, f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' f. E- {  R" @unsigned int count_copy = 0;$ n$ S5 b& ~" Y+ P4 @

% L5 w6 b$ b) \* t# X% M0 k  H9 s0 X# ^. Q
int main()
- Y& L. n8 o/ L4 u, I{9 x: C2 ?" a# z  w5 g0 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;' Z3 w# [5 q- j3 U/ u1 h+ x) t' ~
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. x; \2 y7 w" L
% [: I; F/ t  Z) j7 \- K
        while(1)( g( Z. D0 r9 M5 t7 M
        {  B0 s9 G$ n  P$ L7 a5 h/ A
                read_MSG_buffer(pshreRAM);
! i  u6 P* I' P/ E3 N$ H        }               
; ~$ C8 E) q  ^9 [1 t}
* [% g1 D! D  u7 q% U; Q4 f/ O+ C
+ W3 }+ z5 V) [$ \8 m4 S5 zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM), C# |( L4 w. z  m* H$ r( [' O" R
{
( v4 D6 [/ x$ {( d' L- n8 C        RX_MSG_PROTOCOL buf;
0 M0 D1 D, J2 N3 j3 z+ J4 ^        * H' j+ R! R* v4 D; O
        buf.a = pshreRAM->a;: y. l/ n* n/ y% P6 Z1 a
        buf.b = pshreRAM->b;
$ |5 [2 {, ]1 I; y# H2 Z5 l        buf.packet_cout = pshreRAM->packet_cout;: L' m2 n3 x5 p! u/ V$ |
        7 h, d/ Y4 o; a" s+ o
        if(buf.packet_cout != count_copy)
  I& j8 c) r- t' C        {
+ d7 c0 u& {: A                printf("a is %d\n", buf.a);, n) F$ B& s- K. L1 T% H
                printf("b is %d\n", buf.b);" }; U1 |, z. H7 b
                printf("count is %d\n", buf.packet_cout);
4 F5 \# J+ r  y4 P                count_copy = buf.packet_cout;4 K5 e; f4 E3 o# d( m% E
        }
. P0 g/ g9 r$ Q( y+ w$ S5 [; w. w        else3 _9 ?0 l; W( K6 k% Q, O0 S- p
        {
+ ]* {6 e- Y- e. V/ M. d' b, P7 m                printf("No effective message!");
/ Q  L3 D! }6 \        }
- I, H- ~9 k  T) y1 \8 Y8 ?}$ G" O5 U& w& q

5 a+ C9 D4 Z7 i1 `% B# ]+ `4 F; \: ^$ T
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; J6 k' L/ ?  p, Z
使用下面代码,对内存使用了mmap函数后:" Y* e! u. N1 v/ e' P  M  b4 w4 B9 F
#include <stdio.h>
: v3 A. n2 {" p#include <unistd.h>
  R' J9 W! v2 V  c( A#include <sys/mman.h>/ b/ T9 R) E: z& r1 I
#include <sys/types.h>( u/ v) h: _# ]- R+ m) ]7 o
#include <fcntl.h>
2 t% K! C: j4 j3 k2 D: p6 p$ o9 Q7 K0 T
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- u" ?- x) s5 K1 k9 f5 D( x8 Z#define SHAER_RAM_SIZE         (0x20000)   
3 ^1 H) x  x+ j( s
( X* h) q) u& s: F5 P/ jtypedef struct
' A* h3 }+ c: s2 ~% ?, B$ w{
" Z" S+ `3 s% C; K. Y$ g$ m        unsigned int a;
3 ?+ Y7 c" J7 @! E4 Z        unsigned int b;+ U4 v: i, I( R% {2 w
        unsigned int packet_cout;
0 c! m# w/ ?0 L7 m- v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& k$ A. F- r) ?2 M' o  Z9 W% u+ T$ C. }9 C% ]7 [
void read_MSG_buffer(int *baseaddr);) A* q4 H) C6 r9 Z1 w- k" U
unsigned int count_copy = 0;
: E- w2 V. P6 Z& d; y# h- K5 a9 |$ q
int main()
! H) J& E0 ?  a% C9 W5 S# }$ p{
0 [& ^8 b* l" G& V        int fd;
1 g' e1 C1 d5 N+ j# J' h2 i        int *mem = NULL;
9 U3 w5 f5 O% Q1 V& a. i" z: d8 A0 ]' p
        if((fd = open("/dev/mem", O_RDWR)) <0)0 M4 {9 O( o- ?: R: }2 ^
        {
1 B4 p  x. S. ~( y, d( Q                perror("open error");
4 O& t# m' f+ [/ g" }5 c                return -1;1 A# O: ^3 Y: e$ Q8 h# l
        }
6 T: D% x* U( s        
% {0 |* u5 s# P3 C1 H' h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; s9 Z% i) \+ a* Q" |& M7 {2 ?) k3 U) E' D2 N
        while(1)/ k* _6 p5 E% L: d
        {
* h, t$ Y1 u5 w% Q! A: |- D                read_MSG_buffer(mem);
' V3 s7 k. y+ P' p        }               
0 w0 L3 w6 B' G5 T' b. V9 q5 y7 R}3 s1 i8 A6 Q: z4 E+ Q
9 H, e8 \0 y0 U! u
void read_MSG_buffer(int *baseaddr)
5 U4 y- G6 H( B, a$ u5 ^8 B{
4 }4 G* K" K# K8 g3 ~0 g% @, g) u        pRX_MSG_PROTOCOL pshreRAM = NULL;
* q* C$ |/ }; N9 f+ \* o. J' ^& R
9 d- g7 i% r( `2 G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& `2 k6 v, q' `  e( h, @

2 H$ v/ Z( K. p. O        if(pshreRAM->packet_cout != count_copy)
7 Q) h. e* [) f* B        {4 {8 |, y( S, S" W
                printf("a is %d\n", pshreRAM->a);
* A4 \+ a( p/ j. n& R                printf("b is %d\n", pshreRAM->b);# I# r) U4 I+ x1 O" Y1 E
                printf("count is %d\n", pshreRAM->packet_cout);
, Q, t( \$ b, M8 p) T0 n* Y                count_copy = pshreRAM->packet_cout;, t8 p3 o- C. w% b+ W
        }
( l8 t3 b5 N  b9 S        else
% E' V$ q( s& C4 O0 o& }        {
5 X' G( M$ a# M7 x                printf("No effective message!\n");) }* z6 m, d& v6 O1 b+ c- T( p
        }- Y5 e8 T2 ^' V4 T# }
}
8 S3 i3 \: [  \6 j4 U+ J" [& a! j0 F( o4 A* E& n  c$ z6 ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 T* G! G( o' [4 R- l2 o; g

+ {- o9 L& @2 }  q' P3 e
; @7 }4 ?! ?4 o9 t7 W0 X
$ F* o" k9 F( z0 _' O+ G3 X% b% G1 D$ M8 C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 12:20 , Processed in 0.046016 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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