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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 `& H9 U2 N' C8 Y4 q9 {3 @

/ T0 Q/ I( D; d( o# t: eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>5 I, f7 X  y! {3 a# _
#include <unistd.h>* ~2 j7 t+ r9 r2 \% D( p6 a- H
#include <sys/mman.h>
( x) y5 g8 E7 o#include <sys/types.h>
* |4 y' T8 f% _0 ~) Z6 i+ D" g#include <fcntl.h>
1 {+ u0 e" W& y7 b, y# P1 b+ i
4 g2 g% c% ]  w/ V1 L0 B#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 d- F# w7 S. z% J/ K1 K
4 r6 I, }" c# ^1 ]  \) O
typedef struct
2 `5 ]' H$ F. ^, B{4 \0 d# Y4 Q6 k( J$ P
        unsigned int a;
4 V- {% V5 G# J* s4 g2 e3 h        unsigned int b;
' ?( a  ^9 o0 ~* p+ [  j        unsigned int packet_cout;
3 b, E: m0 c" B; u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# J! q/ c7 t4 x" ^* g+ W7 Q2 r8 F& w9 ]: l8 k- Y0 \4 N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 D/ u- [1 i0 }2 z0 p. ?unsigned int count_copy = 0;( }2 i$ l2 b8 ~3 K7 r" m
4 Z+ }1 m  H/ o+ p
7 F; v& x7 J( K
int main()
& X/ N. q1 ?" c6 k$ O{
/ K$ O4 y1 B; x* w# Q+ ]) a        pRX_MSG_PROTOCOL pshreRAM = NULL;
; F1 d) }, G6 U) U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. q% B; h3 v! V) G. ]9 w- f5 S- L- |! S3 W. z* j+ q
        while(1)
; `4 N/ H+ W5 q' J        {/ o2 `4 |4 i+ o
                read_MSG_buffer(pshreRAM);- d. x% O' H, G1 o# Y9 G* d
        }                ' ~/ ?2 ~+ v1 h" n) i2 _/ |
}8 E5 ]- w5 t0 W- k9 d
4 b7 r) `8 o9 a2 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: L( Y: P" W4 D& [' a9 z, S{
2 ?6 [. \' k9 A( ]  o4 m        RX_MSG_PROTOCOL buf;
) g; z% k) z2 Z( p* X        
0 t  p' w% m! |; x0 b2 m* |( e. @# M6 M        buf.a = pshreRAM->a;
8 M- K* B+ {3 k& @        buf.b = pshreRAM->b;
& m( a7 r2 [! f) U6 l        buf.packet_cout = pshreRAM->packet_cout;8 l- v! h5 }0 }5 e5 G5 j, k% u
        2 ]/ c4 Q( \. O3 ?! }
        if(buf.packet_cout != count_copy)7 m# ?! b8 j5 |% K. ~0 J
        {+ J$ B( k3 ~; G$ y
                printf("a is %d\n", buf.a);
8 t  Y, O# E4 k/ K1 j! \% e                printf("b is %d\n", buf.b);* {  E7 i5 k9 m3 b
                printf("count is %d\n", buf.packet_cout);3 Q8 Q4 K7 t, t* L; q. f/ C
                count_copy = buf.packet_cout;
6 b& g; G3 p  N: _+ e& B" i        }
1 @8 c5 q0 @. g1 u; W' O        else
' X: w# d4 s  ]* |" R        {
$ d; @* o* F- `, g& L                printf("No effective message!");
& [( k. q3 @: j/ D        }/ C) f6 n; _) H8 K9 |3 e* X# D
}
, n$ K  x7 @. J  K) E2 d
' Q* j9 d( H+ c3 v6 S
% z% L+ F- ^1 g4 p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 i* o4 x: ]7 h9 U& g使用下面代码,对内存使用了mmap函数后:
' c- U' Y1 @' K#include <stdio.h>/ i4 |6 o1 l3 _/ u2 K
#include <unistd.h>
$ H" v3 X! `- L7 i#include <sys/mman.h>; ^3 W, ^' B% D# C6 }
#include <sys/types.h>
3 H( t& T2 p6 t  W$ X1 B#include <fcntl.h>+ m. M, L5 l" [: V1 U- {4 z
( t, M8 g% P/ }$ F
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 n+ a2 g5 ^" T6 \#define SHAER_RAM_SIZE         (0x20000)   
2 W% b) k) v4 t: w
' t; V; f% u) \' h* d8 D8 atypedef struct
5 P7 K5 @4 U+ E9 _3 @% J{& O5 l) d4 ]* v4 _8 |
        unsigned int a;
8 Q3 f# t3 R; y- k4 H0 ~        unsigned int b;
/ `  r7 g& M+ _5 Y        unsigned int packet_cout;
% {8 y: k0 t, h0 s1 g9 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 n, K' @4 ]# A$ ?
) c7 E2 ?+ H; C& @% S# {void read_MSG_buffer(int *baseaddr);
# p* [" g& l7 G  i& h% B" \unsigned int count_copy = 0;6 F7 y, a$ h( p% b0 r: m$ p5 z' t
. c! Y5 o' `, k* u3 ^
int main()
# j, W! `0 I% q4 D{
: T. X$ @, s1 k        int fd;
) h8 {  Q8 T0 y% m. F- S. G        int *mem = NULL;
7 u7 x9 I. I0 p5 h3 k; r% u+ F! X$ _
: n9 j$ G& o$ r$ y. C        if((fd = open("/dev/mem", O_RDWR)) <0)
( e! @& V4 C% K  V3 T( _        {5 K) u; j! B, c3 A& [$ s
                perror("open error");
% k3 p3 c  z+ s$ j# [% m                return -1;( O( w  |  |4 `! R: g3 y3 B
        }
; ~6 }7 D& R7 y        
/ O- ~& {: J. G$ x, e$ {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) g  n( [  @" r- R/ S" |2 P/ V1 H
        while(1)+ O# W' K/ U! h  l: n
        {
6 _3 p6 b, C/ ], Q$ g: _/ X) Y7 r                read_MSG_buffer(mem);- ]& ]* C( k# n( D, ~. N
        }                0 u% q& B9 f' |) d5 L& v3 z" N
}
% ^9 E  Q/ F1 w* H1 n7 L9 X
4 d  c! V" S3 Ivoid read_MSG_buffer(int *baseaddr)! r' }; k" ^* i4 s! O, l
{/ {. J: A1 q/ _0 T) {6 v& H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 }% [  `' c( w; [
; J! R2 Z- {# a; s, @        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 h$ q. }6 J, @( T: ^# F* V
4 Y+ |7 K- S; @, E- R
        if(pshreRAM->packet_cout != count_copy)
# G; u4 ?$ _! }) P        {0 A8 J, z! Q* @, S* k
                printf("a is %d\n", pshreRAM->a);8 @9 c0 [4 z: `. U3 c: u0 l# @
                printf("b is %d\n", pshreRAM->b);& r* f9 D- S; V' \6 G( C
                printf("count is %d\n", pshreRAM->packet_cout);
: ?  v% N* [3 @3 N2 a* w                count_copy = pshreRAM->packet_cout;
: |- z9 }$ i( A        }
# x& }! ^* S* q        else8 Q& F4 |0 q( W9 @, g: p
        {
: \1 u7 V4 f1 g0 D                printf("No effective message!\n");; j) _8 I' P  R
        }9 B% I; i3 i, ^
}
6 u  b- n$ q% e) n! a8 Y2 u  @4 F
8 k6 T5 `* Z: d) R# N. e1 P没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 X$ T, l5 s2 u; Z6 c: q5 }7 I

8 U/ U* p; {' Q$ R3 }/ H: U7 k8 Z
) r* P. C$ e' R5 u* Y- @; F- a
( Y. f# `- n7 e. X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-28 08:12 , Processed in 0.041351 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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