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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 K) W6 c: G3 K4 t
. Q4 p9 J7 _# E: z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
4 B; {- E2 z  `  r- r#include <unistd.h>
9 _3 ?! N& x5 s# Y- l#include <sys/mman.h>
: u7 X5 F- j0 S5 m2 m#include <sys/types.h>
& K; v+ k' ?  P. A$ U#include <fcntl.h>
# ]/ h# t4 k) u; l7 A% p0 w9 V" J+ J8 {7 l% j. z6 R8 x% J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. I( v7 j0 b; o" O) N' D' l
- u, |" r9 F- h# j3 a7 Otypedef struct
& [4 R" ~5 q& R' x{
" a4 x% m' ?, I4 l/ e+ Z        unsigned int a;
! Z. F5 @" i- o" j( w; E7 y3 U        unsigned int b;
0 @( f, W* e" }# Z; m        unsigned int packet_cout;: v+ v4 H3 A( j8 o
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  Y" Q) B8 k8 ^3 D! J9 Y
( y+ f% I, [% D! c( ]& Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 T4 M3 I; {! w0 `unsigned int count_copy = 0;
7 g* V( L. x& S3 I& O( }. g5 `+ n* V( q

' D& B8 c: o/ S" N5 L) `4 Rint main()* Y5 D; L, \5 x% [: m  r0 e
{/ b/ G1 v* n+ A/ A0 ], v
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* T: x  q# M+ k! k# t        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ P: E9 d4 j3 K2 ~* c; l

' Q* N- m$ Y3 @6 n) B        while(1)
) {1 w* y4 l+ f: k. _        {' F- }- g' b- ?- w
                read_MSG_buffer(pshreRAM);( E$ [* \* ?5 Q
        }               
* K4 g2 C3 l2 p. f) n}
3 v( B# n4 T' b: S7 C& s. h; b
3 x. P" @6 I. S0 _+ C: y) s2 nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 O. O% M  L7 q) k
{
- t, e! s1 W" C8 O% ^2 J' D        RX_MSG_PROTOCOL buf;
! \% P+ c/ r6 R        ' V) `* Q% n' N7 _; x
        buf.a = pshreRAM->a;
9 ^5 D7 C3 @: u* k2 B. }        buf.b = pshreRAM->b;& m4 @% \' F$ A8 P! }
        buf.packet_cout = pshreRAM->packet_cout;
; o! |! a1 O- \7 m- x        
  h8 e- c$ Q; Z' E        if(buf.packet_cout != count_copy)
! b' }1 O2 c3 v0 W. Y        {+ D, l; Z3 Y4 B$ L% u
                printf("a is %d\n", buf.a);" F7 e$ B6 [2 I% Q7 }; F2 K
                printf("b is %d\n", buf.b);
" i0 B: U9 T: b* _& \1 E                printf("count is %d\n", buf.packet_cout);
' q4 o8 }$ d  u7 M% Y                count_copy = buf.packet_cout;
. B/ @3 b0 e5 S% b) x0 s        }
9 I1 A. r! V4 x* C7 `0 `        else
5 q4 Y& E/ g8 k7 d! G        {" j/ t4 {7 |& U% M9 b1 ^& `
                printf("No effective message!");0 o% d7 ^7 D6 M; d
        }$ W- W* m- A5 W1 e" m3 u
}5 G6 u' a9 Q% z  k

$ {7 k+ [7 |, \5 k0 y  o- R) W! R, l6 s5 z4 c9 S. U( m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* h8 {/ J0 k' e
使用下面代码,对内存使用了mmap函数后:; E2 e, A* A3 H+ d6 H0 j
#include <stdio.h>
  [7 q$ B% Y0 a2 `6 k#include <unistd.h>& M0 m, {9 h* d; V- F
#include <sys/mman.h>$ y) F. x3 L+ n
#include <sys/types.h>7 O  a* f8 O4 q2 Q+ J
#include <fcntl.h>
, k4 f; L" u6 R- w7 o' R6 A1 \- J  c  H/ G; }, d( K" u
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 \, y# i4 L) i
#define SHAER_RAM_SIZE         (0x20000)   
( v  g; t! }) U; t- H/ ~% W3 r4 b& r) Z0 _. j
typedef struct
, T, ~9 X, X# G3 q, \{
5 v- H  s/ L6 L5 q        unsigned int a;
9 P9 x4 [2 p0 H( Q* v+ O  F" @        unsigned int b;
: j! g) z& M; I7 o4 l        unsigned int packet_cout;
: q1 u: ?0 D' F% r7 q" s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% w5 K0 B& ?" Z6 R0 g$ w
8 _. S* [* f$ o' [$ Q" u4 kvoid read_MSG_buffer(int *baseaddr);
5 Y/ a7 E. j+ |% b5 ^; M2 Ounsigned int count_copy = 0;8 P0 P3 R; n$ y9 J

; A7 R, s7 W. \+ [, w+ a  Gint main(); `5 v8 r# [0 g5 v# T
{7 j- f+ f5 j% m/ X5 e% @
        int fd;
2 `( j4 H% u1 {( T        int *mem = NULL;; u4 Q; A, ~0 @9 A  B0 j  d
. d# B' v* U, ?2 }
        if((fd = open("/dev/mem", O_RDWR)) <0)& x8 c; d/ [' i4 Q: g
        {. @. v) y+ I  Q8 J9 z7 L
                perror("open error");! g% k3 f  \0 o/ o7 A1 O4 ~
                return -1;
% g; G; }0 \8 R6 K; c0 N        }) Y6 \+ P# ~5 R7 R+ @% N
        
# ]" z( \& z& r2 i* v6 x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- X, X2 L. h% O
9 U& s; i5 ^8 ~+ V/ B- ~# E5 `  s) E5 |        while(1)
- D% ?  b4 c& I" F0 R' ~        {+ ^0 z" u( @; j
                read_MSG_buffer(mem);
9 K! L) M- a$ K6 x/ r9 M# u& N        }               
6 u6 N- \3 H2 ^1 x}. t0 X* J6 h# O# B

* C  r8 P! _5 n1 Ovoid read_MSG_buffer(int *baseaddr)4 |, S, Q$ g: @! U
{
3 M. h; v. S: D* p  B8 ^  i/ N' E        pRX_MSG_PROTOCOL pshreRAM = NULL;2 G  U9 j! Y0 M2 q
+ N, c6 D9 p9 u5 e5 F. K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! D' ]. H7 y+ ]2 ]: o8 @
; m, `  ]0 t% Q4 A        if(pshreRAM->packet_cout != count_copy)
, _- i+ Y+ A6 P3 D1 p        {$ Y& @( e+ c* M) d
                printf("a is %d\n", pshreRAM->a);) ^0 k+ ]3 _9 z5 R4 {! ~2 t$ Z
                printf("b is %d\n", pshreRAM->b);
6 N& ]* d+ X4 s                printf("count is %d\n", pshreRAM->packet_cout);* A7 N; d! d! y( f1 T
                count_copy = pshreRAM->packet_cout;
# b  o) n# O, S3 S2 y        }
! R( a2 ^" T; ~$ Y: \) {* `4 y. Z        else
0 ~7 g2 [7 w5 Q" a5 h9 o2 B" R        {
6 h* g) J# m; ^# M                printf("No effective message!\n");; M5 v0 G6 l1 f4 R. z) h4 B$ p; ~
        }3 N( H9 o& J9 @+ j$ ?
}
; f& {4 _- @+ m" s3 O2 N" A# z: T1 \4 p$ K
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???% \: t% |' P" z( C/ t% c: X0 b& z0 f

) I1 g. p( Z7 K% f: c' V) B' \! W# u0 s3 B4 q

5 B. W1 L- {% f/ X6 u  T
& N0 n/ H) h. T4 c' x8 O4 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 15:59 , Processed in 0.037066 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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