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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 F1 {" G  X( F9 a- v# n

  M3 p3 D0 B/ O$ Z8 b; X* bOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>! s2 d( N8 ?' M/ J; F
#include <unistd.h>/ [* n2 _5 A' A3 D( Y' C
#include <sys/mman.h>
+ v. W4 f9 A$ h4 C8 \9 e" a6 r#include <sys/types.h>
) N7 h6 R, p, G" x5 q#include <fcntl.h>
+ H& o9 P* {1 r9 e7 O% a1 g" B* S
: W' J0 S% y4 C#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 G; `5 q& X! j
. D& v! {7 H6 A! I) R! Z# a. |+ qtypedef struct
% g1 u* l; j8 e% s& k{
5 B% L- W2 O. [! p8 B- i        unsigned int a;
/ `1 G* d# M( D5 R( i5 `" R        unsigned int b;
6 e+ |; c! X% `+ {. _        unsigned int packet_cout;% k1 z: r& v5 r/ {+ y" w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ Z7 B5 I: f* t' V) ~" P
  N5 H4 e* i/ K# q7 W2 B6 b/ c, dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) ~# k: R/ `) U
unsigned int count_copy = 0;
4 g0 z# t* e$ O6 C/ R1 h& }- i" e" g8 I3 a. l$ i: ]  A2 P

& [9 Z2 e4 q( L! Q- P1 Yint main()
" C- n: X6 V& |: s, e# U{
, l% q; h# C5 f! C        pRX_MSG_PROTOCOL pshreRAM = NULL;3 d* ^. `5 S" ~6 d0 C6 B/ P6 G
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 U" V% ]7 S$ g5 M3 Y2 e2 X
4 e7 y, }. z/ `/ L        while(1)& l, x# G3 b1 o5 r% z5 c! z
        {
, j- }- }1 d7 k+ h4 Q3 p                read_MSG_buffer(pshreRAM);/ Q7 Y; T) }) Y3 ]
        }                3 q' l! I  V6 g: Q: O( n( J
}5 f0 o3 W9 Y4 ^1 C1 q

4 R4 S" F( c+ T( o: Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* ~; l: ~2 f; ~1 z0 L
{
' i9 I8 @- [5 O2 I$ D' [" s' O        RX_MSG_PROTOCOL buf;2 _- {  g( q7 X, Y2 C6 J
        & ~/ ~- U5 }& l5 P4 r
        buf.a = pshreRAM->a;0 ]5 e3 ]0 s9 O: i( |9 l
        buf.b = pshreRAM->b;
, b. k, o) E+ R% f) @        buf.packet_cout = pshreRAM->packet_cout;5 _" }6 f* {/ G( o; e" s* e
        & k) C- z& K( V& I: M7 s3 l8 H
        if(buf.packet_cout != count_copy)& o, ^% {4 M8 E! W& [
        {: `6 R7 l7 W( L+ ?7 v0 K
                printf("a is %d\n", buf.a);
& s) {9 ]- w5 }- P                printf("b is %d\n", buf.b);
- _$ T) j8 X: s& Y8 c                printf("count is %d\n", buf.packet_cout);8 z$ X2 ?1 n1 R2 p( p) k, k  R
                count_copy = buf.packet_cout;+ [6 q9 \1 x* z& L5 D7 v
        }
: f3 l& |! u* M0 b! g9 j8 W0 L        else
8 |# h7 O2 Y# L- D5 c        {( L0 o+ X% i& M8 [' T  r
                printf("No effective message!");; |) w5 W4 o# K. ]; {# F8 J7 m
        }" M) R4 k6 [2 U. B6 q
}( }; e& q; r* }5 G7 s8 M6 W
! a; `5 w* F1 K7 O4 Z

! p7 P/ S* n! R: p$ k但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 n2 b; C, G9 a) j* q. L, ]
使用下面代码,对内存使用了mmap函数后:
' H5 U" O5 q; j+ [#include <stdio.h>5 V. \* n) |$ _7 Q! G; y3 S, J
#include <unistd.h>8 T& P8 I3 o; S# m
#include <sys/mman.h>+ k8 H5 q) B1 Y
#include <sys/types.h>6 O, E( a6 g! J( y7 r0 |7 l
#include <fcntl.h>
, z4 s: R+ C6 W4 t6 u
& {9 |8 v* Z' _8 Z( Q" ?! @#define SHAER_RAM_BASE_ADDR    (0x80000000)
* U& K4 n9 Z9 S#define SHAER_RAM_SIZE         (0x20000)   , X3 Q( P& A- D: W1 Y, g9 ]
3 v; |+ B5 [+ u& _2 f
typedef struct
. Z. k4 [$ N% k+ U4 @9 w2 v" G{
; k+ n) ^# r8 r7 f6 m- f3 {  O+ V        unsigned int a;
$ H! d  e6 f  p" K) R        unsigned int b;
' C+ l- f2 U/ x- v+ @: e        unsigned int packet_cout;
* h3 T5 g3 p  N' _! R4 d/ i* W' y' c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 ^6 R9 M# \3 K' G  Y; s1 j" a5 I4 o) d
void read_MSG_buffer(int *baseaddr);, M, L" \! c/ i- e, N2 k& y
unsigned int count_copy = 0;
; t- s# ]6 _2 \7 s5 N" B7 z( k* {3 w# R
int main()
- f% ]: h* d" W% i7 @6 r3 }# e5 b7 k{
1 V9 K# S9 N; [  b" ?. f        int fd;2 K! r% J0 D0 |3 P, I
        int *mem = NULL;
& O, k  d, L% k
; m6 O5 x# k9 i" i2 f        if((fd = open("/dev/mem", O_RDWR)) <0)
$ g' N- r: [" @        {; w1 _8 E% v: M7 R$ x
                perror("open error");
7 M. f% q5 L9 R                return -1;
0 m; u8 e0 h( N, v8 I. V: ^        }
4 B/ q4 {: y# u4 ?( f4 ~6 T        
7 U; p! o) R9 b9 I+ ~8 {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. O$ l' k6 `  H9 |* _
( C9 i0 T9 f3 S/ l) c$ ~, u4 ?        while(1), f0 F) S+ u9 _8 |. C$ {4 U
        {. S' d: Y& g7 j
                read_MSG_buffer(mem);5 Q, @  Y, @; ]" v( V* X
        }               
- V! R) `7 z3 P  i0 m}6 s; m% K( A9 Y% {# ?5 k: e

- x0 C' T/ l7 @5 x' G  evoid read_MSG_buffer(int *baseaddr)& r2 Y; E  a) z+ ~. U- Q4 R
{: D+ }5 z9 v* g% y6 e0 G, u( x
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- _# G4 X( _2 Y, ^7 L& w- y4 j- f6 T
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" w  Y! M+ k% N7 \6 D
: S2 C7 [3 }1 u9 L1 o1 K
        if(pshreRAM->packet_cout != count_copy)
' b* h: {$ h1 f5 W        {
7 n9 z( o, K4 a  S3 K/ E- F% P0 u                printf("a is %d\n", pshreRAM->a);
4 Y5 w8 u1 S' S. j# S' y                printf("b is %d\n", pshreRAM->b);' [; ^8 D8 N& O3 U/ M
                printf("count is %d\n", pshreRAM->packet_cout);
1 v4 Z! F6 a8 f                count_copy = pshreRAM->packet_cout;. J0 x( |9 _( ^# w, |6 s% W! M
        }
8 F# J2 `. }4 U! }4 N) J: P# f3 s        else/ K$ ^# O* \% R+ p
        {+ @  V0 t' A6 `* W) V1 Z
                printf("No effective message!\n");
) J8 l  {( c5 t9 W        }" [  s+ T# G& O4 B. G) l2 W0 }
}2 `  s4 t& D( i( r

$ t) p. c1 x/ E4 A# ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
& G2 }, \6 x2 t* K; f5 k; a; F3 J7 P0 d/ x' |" o- U' T4 r
" M9 w) @4 ]2 G% w: T2 R

$ P. Q: W. r) v, o" F4 b6 G$ N, z& d. D# _2 n. N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 22:32 , Processed in 0.042616 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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