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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 D2 `2 |6 @' g6 G" o: c0 ]4 h
" t* a0 Z4 U: q/ T& TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
, p# ]* H% f: a3 P) N#include <unistd.h>4 ~" r' W  y0 q9 X, q  }9 b9 i
#include <sys/mman.h>
: ?, K1 G; P5 K#include <sys/types.h>
# _1 Z5 S. H: O( X: W! T2 B#include <fcntl.h>
; s% d! v, {: y" C; b" j; K/ p* Q1 a6 ?* I
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
0 j9 `, f7 S  s$ N' C. \. q3 ^
5 L$ z# m9 \4 Ztypedef struct
7 m2 x- C2 P, X* K1 j+ T1 q8 `{
5 v" S0 S1 L; h3 q1 N9 g        unsigned int a;% i& g1 d, a7 J5 A$ Z$ L
        unsigned int b;. n0 {5 j9 r4 N( F" Z
        unsigned int packet_cout;) F  e& g3 c5 b$ V* u+ L; ?' M# s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" j# w7 |% I; M( e7 Z1 h) ?( A" C

2 a, Z5 w. ~0 a, fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 ^2 b6 v) H6 `. ?6 y4 m  A9 Q
unsigned int count_copy = 0;* k( C# M2 I8 E& o' y

/ V6 ?, |' o& v+ X( F- ?( N; U
( @2 G% H' n! j5 H& j8 [' Pint main()4 ^+ C" L# U) r& I  I
{
7 r; b8 h1 v6 t9 e! `# m        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 j7 H7 \& U  b/ t) H# [        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;" V( l. `* r. S4 e
6 H- H! N" E/ g' K
        while(1)% {2 @' c4 n1 t+ t% S/ W
        {3 f4 g2 e5 i$ |3 o
                read_MSG_buffer(pshreRAM);' _0 U  F- b% d0 a2 F
        }                4 |4 _, ?0 Z2 D+ q
}
: @+ v" Q3 Y; r  T4 O  f
- x/ `- h) d$ |8 b5 [+ k# J$ I6 L; {void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: P6 ~) W8 \4 E3 C3 ]! L3 G: k3 T{3 s9 y% ~; M( R3 B3 u# [; o8 P* g' K
        RX_MSG_PROTOCOL buf;
6 K3 B4 F& B& J% M! ^# A/ C1 C: o        ' Y$ N2 J7 r. G9 {. b
        buf.a = pshreRAM->a;) A, p+ [* O4 a& e% ^7 I; r
        buf.b = pshreRAM->b;
7 h" h* }) ^  d) \        buf.packet_cout = pshreRAM->packet_cout;
7 Z8 [% e$ v6 T. X        5 P: d: M5 {, s' ]/ I. t6 K+ S
        if(buf.packet_cout != count_copy)
9 u- G% L% n9 V; f        {" T) i7 i0 G, G+ w) r
                printf("a is %d\n", buf.a);
2 [# J3 Q# W% ?6 Z* w$ T. ^                printf("b is %d\n", buf.b);, c% C9 W0 ^1 F( k" }0 X
                printf("count is %d\n", buf.packet_cout);+ e1 [$ p3 W" Y% Q
                count_copy = buf.packet_cout;
2 P- e1 a9 _' D        }
# }9 s2 k" m) D        else1 a' |! A; Q7 q& D0 d% K
        {0 m3 L' ]3 `3 m5 ?
                printf("No effective message!");2 ~7 e# R- H& N+ _/ _+ G0 a! t
        }0 |- o5 x0 s" O& k% `- P/ ^
}
, H) g3 W0 v0 W6 w, Q) `, x
9 V  \( p6 D# r; ]- Q7 O) t/ }1 D/ A" j' \' @
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
2 {$ |2 Q2 G, h) k- y使用下面代码,对内存使用了mmap函数后:
; A/ {2 J3 _. b3 z* z% p#include <stdio.h>" d- h8 {% r2 w! R& W6 j; e
#include <unistd.h>2 V$ y$ R) P( W: {) @
#include <sys/mman.h>% c" o# i5 X7 h3 U$ i
#include <sys/types.h>; S/ X7 d5 y. d1 Z
#include <fcntl.h>
2 {0 a9 L+ r. O& I3 ]9 m
8 r8 J* H3 s( ?- N- V#define SHAER_RAM_BASE_ADDR    (0x80000000)6 I- F9 Z' b( l
#define SHAER_RAM_SIZE         (0x20000)     @$ W+ k* Q& F" l& {2 p* p
. q# `  R( u) }
typedef struct
; b% V1 l' w. t2 M" G" n5 E{2 [$ h/ R$ Q2 ]; ^; L0 j
        unsigned int a;9 T* }' W+ U# N- f' T5 X
        unsigned int b;( t0 z  x* G* U( W# B2 ~: _
        unsigned int packet_cout;, B1 R) [+ c0 v6 D1 c" e
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& g( u6 H' B( H2 C# \/ m, r- j- m2 T3 j4 F6 H" U+ F# C0 P
void read_MSG_buffer(int *baseaddr);
# k1 R6 a; M/ f. i) Funsigned int count_copy = 0;
9 h& q/ H0 |) B& G2 O
1 C% o8 B# q( @! ?9 I: X) T# ]int main()
2 k  w( m0 K) X9 s4 L$ F, r{" b8 Q6 N4 @& w* ^3 I" m
        int fd;1 t# n1 G, p9 O* a9 k: W  Q
        int *mem = NULL;' W' D; D+ U; e

; Y' [% I7 ~6 b1 e        if((fd = open("/dev/mem", O_RDWR)) <0)
7 X0 n6 z3 ?% H" `# K        {: a) X6 I& I& U, {* U$ A. r3 X
                perror("open error");
, _# F) t, C' b/ ?9 J3 ?                return -1;
0 b, b! ^$ e! H/ Y. A        }$ i+ l3 q- b& @) U; [1 _9 u
        
( n; `) ]( m9 _+ L' |$ K) \  `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ l: ^+ N4 n/ h, n5 \7 J( z4 ~
  k; J2 q! x/ O
        while(1): G. v. \: r" k8 f4 h
        {
% e$ d; e+ x# X- d) W- V/ O3 |& o                read_MSG_buffer(mem);
( R8 J1 `" p5 ]9 `+ }+ s0 z        }               
2 k: l7 ~2 I& I}
' q# ]. U8 [# r+ G$ r3 w" Q/ e( E
void read_MSG_buffer(int *baseaddr)+ T  F7 r' h8 b3 P: m$ N/ j
{( H* R) G; W3 l) }; y
        pRX_MSG_PROTOCOL pshreRAM = NULL;" r- `: Z5 Z$ _+ ?$ ?* t' q
6 l+ l+ S  b0 S  l# W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
2 x2 F. f# Q, O- Z5 k3 E
* T8 A# ~6 Q# H2 O* t) F        if(pshreRAM->packet_cout != count_copy)7 r! k" K7 W/ W& c) j1 l5 t( e
        {
; q- M4 }/ t7 ]. H+ u                printf("a is %d\n", pshreRAM->a);1 p1 Z& W# i9 ?+ C* ]2 }- q; H
                printf("b is %d\n", pshreRAM->b);
+ p( M1 Z! |9 {9 A! G                printf("count is %d\n", pshreRAM->packet_cout);
' g5 ^9 I2 a" J; K* o                count_copy = pshreRAM->packet_cout;' `! Q- J. `( R4 K3 {' l
        }; Z% ~5 b% N7 p6 y7 s& y
        else" y. u0 [8 [* }% j8 t! C
        {
' v% u( ]0 N7 A$ ]/ R                printf("No effective message!\n");; g; c7 X0 J, r8 F' c( Z
        }
$ z& y, k3 T, W+ Y& ~. U3 E6 z}$ |7 a6 |" S* p4 A  _

+ q6 N1 E9 a' E1 E; t没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 J& \; x* y2 b0 s) \0 {* Q6 e6 i! x1 j6 q2 _4 g# N3 O
; L- A; X, ?# `$ ?
; V$ Y8 c5 P+ b) j# A( J: S

. F# j* V5 M5 `1 U0 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 22:04 , Processed in 0.040537 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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