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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 F% g2 o1 j9 F" \  W& a  W
8 X( g2 W6 f- c- o7 Z
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>' B! u- `1 u$ p+ o2 l6 E
#include <unistd.h>* a1 L! P* Y8 ?6 Y* ^  A+ ?
#include <sys/mman.h>. b! w. M) l, T. [. `* J
#include <sys/types.h>& D  u4 \! R$ T8 G6 W8 P) B
#include <fcntl.h>
4 P. N3 I$ X& w: T! G" Y7 S) {
( G' e, l  q, C" L/ n. [7 q+ A, M$ @#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; s" n$ W; \% E2 ]
3 R3 n/ B8 c0 S. a/ @' i: ~
typedef struct
3 b# Q/ K, \, A" R{
( l/ T! C  p" m( A( ?: P* U2 G1 x" U        unsigned int a;* e  e8 x( {# l4 ]
        unsigned int b;
1 k0 @2 q9 V- R        unsigned int packet_cout;
' Q2 k" p0 {& t  Z1 X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. f9 @, k. f0 P7 F7 B

1 N9 [2 Q3 G/ [# i7 M* Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 o' E8 }! ~/ e8 g1 _$ }
unsigned int count_copy = 0;# a/ m4 Z4 @, a( {! a! ?$ q: l

, C! ~0 V) ~* N7 O
8 T% `' x+ `" E1 q5 |int main()
( C, X& ^+ M8 J$ W( V0 V- B4 {' n{! ^9 K* i  m  j; ?1 u2 c
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ H  n1 i3 A. {3 l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! g1 G3 m* }% X0 `( M

; j! v9 b5 Z- [/ ^+ _) N! R        while(1)
  I. U# j. o: G. A        {
8 q& Z/ o# x) b9 u' V                read_MSG_buffer(pshreRAM);
2 f1 }  g. j4 b. i7 _5 [: [+ [        }               
( e$ s1 O0 @9 s7 `0 f% W}
& }; {. }6 ?  x* U  K/ d  n& A: y6 V) X/ e% M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 Q9 c7 g& Z9 ?{
5 c9 `+ k7 V& f6 v# B+ P        RX_MSG_PROTOCOL buf;
' P& ?/ ~, x. ]% j: y        
6 f5 Z, U- G* ~/ }# E6 N        buf.a = pshreRAM->a;
- H0 x) a1 }5 g        buf.b = pshreRAM->b;2 ]" Y! _% J! k- h  j. V
        buf.packet_cout = pshreRAM->packet_cout;- l# J) C+ |& g0 S! T
        * G1 }# S  _' D5 w6 T
        if(buf.packet_cout != count_copy)
, A. k4 L" K! M) W        {
! ?2 v5 B; u( r5 Q. U  D/ }" p( t                printf("a is %d\n", buf.a);
, I0 v7 ?6 d6 |/ T                printf("b is %d\n", buf.b);
& z5 t% V; I6 m9 o                printf("count is %d\n", buf.packet_cout);4 X; F% X" W% `" b
                count_copy = buf.packet_cout;
! b  W' i) A7 b$ U$ H        }& n$ Z/ P3 E- d% D3 Q; O
        else
; [2 P3 K( a' b* R2 V0 U        {# d! w5 o6 {. m8 I( }8 P
                printf("No effective message!");7 Z6 J1 T9 n3 c
        }+ a7 Q7 ~9 h4 _4 @6 R+ g2 C" `4 ~
}
5 p/ R; v" a1 U0 s. V9 v7 A: l# l/ }% b' n1 g  S
" n: U# s  Q. h; S5 @, h+ x+ [8 P1 ^! M
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 c4 t8 O' V* _7 B使用下面代码,对内存使用了mmap函数后:1 s% f) s# @/ ^7 y
#include <stdio.h>
" B. r( ?: O/ F- @, }  k* N#include <unistd.h>
; c3 C% `# Z3 B. _2 O% ~: V#include <sys/mman.h>3 c7 _, x% _; y; `% U) P
#include <sys/types.h>4 N$ e; M/ m, I7 ~2 N; M
#include <fcntl.h>
1 U/ F. q" I# Q- ^- B, F1 E  p) z# {& _( `' Q7 O9 \! u1 n* H
#define SHAER_RAM_BASE_ADDR    (0x80000000)
# v3 r2 b. X- [6 m/ A7 R#define SHAER_RAM_SIZE         (0x20000)   ( ]) E1 k/ l- T
# ?$ L% t8 I  g5 |
typedef struct
2 O+ _) y! [6 |{
# W6 e- O! j6 n8 _$ p% W9 t( @# b4 i        unsigned int a;5 b1 W' \, I0 Q( ^" h2 o
        unsigned int b;5 o- ^5 a2 H8 E" B9 p: Q
        unsigned int packet_cout;
5 p# o& h. W; o2 ?! J0 Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; O' F. C' c9 b

7 O3 T% ^9 g# j* fvoid read_MSG_buffer(int *baseaddr);
) L  {: M, P  h7 z9 runsigned int count_copy = 0;
% Q1 E* t: ~! s1 N$ e3 v. Z
6 `3 F8 N* C$ jint main()
; ?2 ?7 u  X5 X) Q. p# `5 P{4 E( B: r7 h9 I7 l
        int fd;7 h5 H/ @5 J+ _6 s, N4 ^; w
        int *mem = NULL;& n9 ]% G+ O0 t; a. x% V0 h
; ~" k2 }  {8 i$ F% V0 t
        if((fd = open("/dev/mem", O_RDWR)) <0)
! K! z7 ~2 W/ C$ d        {
* V$ N$ S  x: Q$ Z: P3 H) x! U                perror("open error");
2 L" Y+ I+ ?: ]6 }+ w/ v  M                return -1;
1 L1 F' a6 W1 q/ ?) R        }
- \# O' \- N1 V4 ~! c/ z+ s' j        & n9 N7 h9 H% r; p
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 d2 @" I" j' j9 G3 Y6 @6 _- W  _0 [' |. d2 q, {
        while(1)
0 a8 ~& E& h( A* `* @) t% x        {! m/ s3 ?+ K5 ]
                read_MSG_buffer(mem);
; D3 V9 L& m+ k. x        }                ; T3 P4 O9 z. S" }, R3 a9 u
}
. \1 X5 a" X  l9 P5 S8 z) ^4 p& j
void read_MSG_buffer(int *baseaddr)+ u9 G8 R: A9 A8 l' {" k/ G
{9 X3 M/ Y7 t. ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) p  I, ]% y3 A4 P: @2 a
. M& L' f7 a- e7 x        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& f( y1 ?, C4 z' q# j
7 U- r- e0 B7 C. j) o        if(pshreRAM->packet_cout != count_copy)( m$ i3 O- y" {0 U8 l
        {1 Q6 V' o7 x1 k" p
                printf("a is %d\n", pshreRAM->a);
4 O, o: ?8 G( a                printf("b is %d\n", pshreRAM->b);
8 x. D  H7 |- p4 V* K8 M7 a* K* X7 h                printf("count is %d\n", pshreRAM->packet_cout);- M/ o% T  S6 Q% d# G
                count_copy = pshreRAM->packet_cout;
; [/ {2 p8 Z; `& p) Z4 |9 e        }
% S) E$ r9 ], J& v; W9 S        else
8 z, T# l9 Y; j  R: g( E        {
7 h7 D: V/ E1 N3 U9 j                printf("No effective message!\n");# S7 s" q; l* W+ _
        }( i5 i5 ]9 n  }' U; N0 [
}+ ~0 K; K/ P" ~0 @/ Y% I) b

, A/ r  ~9 C! X/ q9 W- J没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- b3 L: d( w# t  E: r1 Q
6 x4 ^/ @) P1 y8 g2 @3 o( J
5 J# D( V0 I) n; o% F
1 ?- u3 Y) Y/ g4 X
$ e+ b4 {! D# P0 ?, i/ J4 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 04:34 , Processed in 0.049612 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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