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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
6 \/ f3 x7 `' t# L+ l! {3 n; O
* c' y  r9 I) A) C4 X3 |/ OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ {" ^& x2 l9 a$ A#include <unistd.h>0 `. i4 J* f" T
#include <sys/mman.h>
. J6 }8 V/ \1 D5 s; x5 m6 ]& t#include <sys/types.h>( k, m2 _5 \) [3 o
#include <fcntl.h>; k- ^+ r  t# g- Q. s& I% }

. t% l3 b) \4 z8 L: B% Z% N#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# O" x. y5 V; b1 l# `  J* r" L: M+ K; v9 r! w
typedef struct  e5 G; O5 u; E( X; [( q( E. D; Y7 U+ h
{
0 b: [3 P/ _4 W9 f. i; @2 I: @        unsigned int a;
1 U- {( d! z( L; C2 Q        unsigned int b;* J$ }. D. E7 K" p+ q8 H- Y
        unsigned int packet_cout;
5 s& O$ A$ J5 H  ^& h+ W2 R+ d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. L* H2 K1 @8 ~5 r5 ?

! i5 a# j8 @  T& H5 O! E; j& D0 J/ l1 `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 w& K8 S0 J+ n. P
unsigned int count_copy = 0;
  u6 `9 {* o7 x9 H$ ^- M* b, `
/ i/ d! q/ h$ r4 [, U" C  N$ w$ n$ D6 P
int main()
# O4 F* u* Q1 n% ]4 x8 y* `: E{6 g! r/ i8 M: z9 ]2 l& |6 s
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 q4 L' I' G3 u; e8 b: D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& _  @% \: {% x& I4 a
9 a) k* K  y3 I
        while(1)
* k/ c0 M/ S" K, t        {
( T. W! f/ q) d$ I; T" g                read_MSG_buffer(pshreRAM);5 U' V4 C7 J+ r: n: m9 D7 R
        }                1 C: q. f0 [; B
}
! M6 n! n6 A' d; e& E4 a, }  y% k
5 ~, A: Q% ?/ l8 Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! W% Z! N2 D' n{. V. y! t0 g. v1 J+ J$ E6 q
        RX_MSG_PROTOCOL buf;% G* j  Q4 ]' B; P9 Y
        . p5 |7 c6 U4 R, O
        buf.a = pshreRAM->a;
) J& h' h7 w7 B1 J3 C8 X$ X        buf.b = pshreRAM->b;' H' ~0 F& e$ B
        buf.packet_cout = pshreRAM->packet_cout;% X# w. p, b* {- @1 n- D$ V5 D( l
        9 u; S7 d9 Z- C) @
        if(buf.packet_cout != count_copy)
' F+ f' r3 O% l% I" M$ U) F# f        {" g/ i7 y' k! ?6 U3 }
                printf("a is %d\n", buf.a);
; x$ y; p3 F9 y5 z                printf("b is %d\n", buf.b);  _" l+ }6 g/ |" U1 t9 V
                printf("count is %d\n", buf.packet_cout);
" B6 L- d5 p4 X. ]! C5 G  l                count_copy = buf.packet_cout;
  a; D7 b* u: w) F  c- L        }% Z7 Z$ k& J8 S) W# q, A
        else
6 r( y! L5 W2 }! w        {
; @# M6 i% G8 g2 V                printf("No effective message!");* [( P' H- V7 S# {( V* g
        }. K0 {& G* ~  H
}+ e, {5 {( J# ~  `8 P
9 B' H! x7 ]6 Y0 |! N4 ~
" `& z! s, F/ J1 N1 Z# I) l. N
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。* @# E% |! E  g/ i
使用下面代码,对内存使用了mmap函数后:/ Y: S$ w( x: f0 K
#include <stdio.h>5 G0 W8 U7 E; I8 n9 Z7 S5 ~/ g
#include <unistd.h>
" N( x- k( z( J4 t& ^#include <sys/mman.h>
0 J2 q! {' f3 w" _: T$ f( j: T% H#include <sys/types.h>. T" I0 ~- C- u& i- k
#include <fcntl.h>+ j# Z0 q4 _, g8 x4 H3 S
. I% b* J( M4 ~& V7 J" m2 j# _
#define SHAER_RAM_BASE_ADDR    (0x80000000)
' G$ w4 c, ^" ^$ b6 ~% j#define SHAER_RAM_SIZE         (0x20000)   
8 t! |& E# S. j/ @+ X. P
" k- M4 P3 g0 X# Gtypedef struct
0 m* }: Q9 y4 I- _* t2 q{/ g4 L0 N. j4 o; W
        unsigned int a;4 ]8 Z* a8 M1 u" N+ ?! u$ h( Q4 |
        unsigned int b;
# n% g1 @8 {; V% g        unsigned int packet_cout;
, P6 c% y9 N8 L" u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; E! p) e0 P  \+ G4 f" S
1 ~5 n$ y4 f5 [void read_MSG_buffer(int *baseaddr);6 [( C) o8 ~' J4 t9 ~6 K5 H5 p
unsigned int count_copy = 0;( ]& g2 E7 l8 U
5 S% K+ v5 Q! K
int main()
! H+ E* p) E# [& H4 [- P{; k- A& M1 \0 E
        int fd;
7 U* d/ @" Q# w6 t1 `2 F/ S; N        int *mem = NULL;
& M' N. ^6 ^) d9 `
+ V' g* S, ]0 `4 @! r5 w: K1 J        if((fd = open("/dev/mem", O_RDWR)) <0)" Q" c1 M" m& @3 @3 T9 ^1 Z
        {/ o  X6 P0 m( ^* W0 s
                perror("open error");- |7 u* T8 S% f' W, V9 l; C1 I
                return -1;
% C: N) I  f; ]3 W% G        }1 ~7 i9 z/ j; W* r
        ; e1 c; C7 Q. l9 L. _/ P1 @; J
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 c) ]5 S' a- K# p  M

! R  Y$ A/ K: \( Y        while(1)
0 o+ v# a( M, k0 S/ m! j' O        {  v- }5 |0 W% m0 \6 X
                read_MSG_buffer(mem);
& j6 b8 x; y( `' d- y2 Q) c7 A9 [* m        }               
% s  ~, z5 _7 [) r7 B+ G}+ m* \( X- o- ]% b' U

: Q6 a4 U4 B, W4 ivoid read_MSG_buffer(int *baseaddr)
. x8 N& J1 Z3 e5 n* k{8 F2 N2 N5 h6 [  f
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, x- A6 m! ?1 K1 O
/ n9 t3 G& d' S  a; h' Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;0 u/ ]* R' [( P$ n1 i% {9 p: [+ \
, X% D! C. _; t; ]( h. u
        if(pshreRAM->packet_cout != count_copy)# K! w8 F/ L' q' j, f  Y
        {
5 e7 p8 ^2 t! @- ~9 \2 z8 E) N                printf("a is %d\n", pshreRAM->a);- s! j- t8 W# \) j; a! W
                printf("b is %d\n", pshreRAM->b);
  {0 g5 {% u8 ^" v" {5 ?. w$ r                printf("count is %d\n", pshreRAM->packet_cout);
) O8 e- ~( ~: x- t                count_copy = pshreRAM->packet_cout;
$ l8 Y1 o/ w( K7 f        }( C5 k7 N) _- r
        else/ p% r2 x- l! \
        {: h) V& B4 F! z2 k
                printf("No effective message!\n");
" k6 y: V1 E* C/ E6 i4 [        }
0 O5 i( J! \3 H* ~( ?) x) w}# P( e$ R- C2 w

9 y& t4 v1 b. b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 i' N5 A) O# C, ?8 ?% b
: e  X+ f2 Z+ O7 k

+ E: T$ t3 e5 W' ~6 Z) s9 f# |/ K- n; i
* q) F5 E/ ^: c( X$ b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-3 04:48 , Processed in 0.046275 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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