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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- z, b4 E0 L/ e8 F8 d( a# h6 C; _
% Q; q0 b; ^$ X+ K- WOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>: k. J$ K+ p( p
#include <unistd.h>
, L7 p! k$ G  `' ], e1 y#include <sys/mman.h>
7 q( a; |7 m  f. X#include <sys/types.h>0 R, m* T8 r( L- B( I) T* W$ \# P
#include <fcntl.h>
) s1 D, H0 A( s4 c. X6 q
* V( B2 w: |  r5 S3 \5 N4 C0 M#define SHAER_RAM_BASE_ADDR    (0x80000000)   + _; ~& d2 l& \3 G
# @% ~3 S* A1 }: w/ h; Z2 @
typedef struct% h% v7 _3 f# o% ~3 \, G7 Y
{
1 A& S: c+ b" j: p! R        unsigned int a;0 V$ N; ]) M) G8 @; p# R
        unsigned int b;
/ \/ L6 e. B7 W0 Z# c        unsigned int packet_cout;3 ^. `, J+ q- O" K: L3 A# Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. H8 y1 i+ y% I& e8 K+ V# j3 Y% g+ R9 p* ^: u! C& _1 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' X5 t( x2 G7 M& u
unsigned int count_copy = 0;  Z9 O* A% `1 ^: x

+ \7 P- U  Y/ k2 X& k6 e1 g
0 v4 V+ D9 ~' i  k4 E* \$ I2 Sint main()2 O" f7 h- \5 t3 l2 M8 E8 Q; ]( f
{
1 w& ]% u2 V+ n# A+ K        pRX_MSG_PROTOCOL pshreRAM = NULL;2 w2 j1 u7 f3 ]6 C! [; Y" u
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
. `% M/ o. N! Z' v2 z
- W/ K" Q' ~7 D8 ]- {        while(1)& e# A* m6 P: N$ B
        {
2 p& X! t4 O" m. \4 P5 ~/ q, l                read_MSG_buffer(pshreRAM);
" N  B3 S, U, r        }               
* H4 d6 K- E# N* t! U$ b}9 H+ R+ U% {' C

& p/ Y' h! k* R9 c: P- Z$ c# Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" o3 y: S7 o8 h+ I* J# C" ?8 y{: h$ I" A2 K- X* @
        RX_MSG_PROTOCOL buf;
" d( D: A" \; t; o; l6 E0 a        
  q* X' m0 x; a8 X+ y& N' Y        buf.a = pshreRAM->a;
# T/ [7 t8 W' E( |$ W: [, l1 X& a/ m        buf.b = pshreRAM->b;
8 D' u5 A4 Z' J( h9 E9 c# R        buf.packet_cout = pshreRAM->packet_cout;
& j0 _; d% v' N$ h' }4 W        
- a2 T2 P' m: }) |* ?# `3 S8 l        if(buf.packet_cout != count_copy)- ]2 ~1 N4 i4 A) E! E2 x* f7 x
        {
2 E) I7 k- n  U! u                printf("a is %d\n", buf.a);
& q8 x( r5 k6 ?  m0 {) W                printf("b is %d\n", buf.b);) @! S' [  k9 c6 Y) O# [1 ?6 g
                printf("count is %d\n", buf.packet_cout);% M9 @  _9 w, a4 A3 R( ?% D+ l: b# e
                count_copy = buf.packet_cout;
1 o' x# M$ a$ v% H) k        }
' K0 t4 K- P5 I& S, Q9 z7 {2 N        else
1 H0 l6 {- w0 V5 S1 e- Z9 e        {/ y7 ^- u  D8 q
                printf("No effective message!");
* ~+ s  ~7 o$ @; p: |        }3 f; @! ^! S4 r0 j: G; a3 p5 p
}
8 `0 Y/ I2 B9 _: n2 K! r& L2 k
3 D' p- ^/ D$ S' O- n& ~
! a4 V$ a. H+ a) p$ M" E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# v/ B/ O) L, I$ t+ l
使用下面代码,对内存使用了mmap函数后:5 S( N+ a+ Z( E$ C
#include <stdio.h>
6 c6 g6 Y- [- }* s! f. |$ ], @( ]#include <unistd.h>/ m3 l7 `( E$ }4 f' }
#include <sys/mman.h>
. R; j! W" H1 K" q#include <sys/types.h># w3 D& P- R& o3 L* }
#include <fcntl.h>
/ Q5 j( |7 j% ]+ u* Y* v3 {/ j9 F, g) P5 Y- H/ ]; \' E6 W9 n
#define SHAER_RAM_BASE_ADDR    (0x80000000)
9 [3 X$ }+ ^5 K, R: I& p#define SHAER_RAM_SIZE         (0x20000)   
% |2 M* z2 \6 [/ q; D0 j" [3 j' ?9 F4 i, z  A
typedef struct
  P( c! A- U3 L; @" k: @4 R" w0 _{7 _  b1 g) e: O  G1 [. c2 W
        unsigned int a;
: V" \+ J4 Z8 R, u) {: ~        unsigned int b;
  r7 P: r0 t8 Y2 B        unsigned int packet_cout;; K, t# M- n2 N/ @$ T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- G. [5 _: J) i- Q% D% G
, @% O1 q3 h8 i! P7 cvoid read_MSG_buffer(int *baseaddr);
5 o! G* t* _2 }5 X$ R8 b% w5 Iunsigned int count_copy = 0;
* e* S) t( ]8 S5 e
  p- k2 N6 l4 H" tint main(), _# V1 h+ k8 s2 U9 X$ o
{
" \4 T; F3 p+ ~5 G% J* P) l        int fd;0 I7 o+ _4 B) K" B
        int *mem = NULL;( |* R1 U1 T' x' T: K7 [2 o5 j

. w/ N/ h6 a6 z& V  ?        if((fd = open("/dev/mem", O_RDWR)) <0)0 P# T9 J, D" B* F0 N6 B
        {
/ r6 X! k% n+ }                perror("open error");" D2 R) T$ ]6 ^! N% z! ?
                return -1;. ^( p! U7 u" y% S/ b6 R2 n0 F1 {
        }
' c- e' ~" b6 r9 R) |. D        2 ?6 Z+ E! X$ s* a' I. \( ^4 Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& v% Q3 C/ i! u* [) C  O+ n7 a
' l1 w. a, \3 O; u$ c        while(1)
5 b0 m$ V0 F6 Z8 ^6 K        {
, p4 _- \# n- o8 M                read_MSG_buffer(mem);/ c" K: k" `* R' x8 N; q* q
        }                1 D/ F, }% u7 t& l5 S5 z" t3 m5 i3 F9 b
}6 G& i; H, V8 a  K
. l  L) E4 \5 N1 D
void read_MSG_buffer(int *baseaddr)
# [5 D# q6 K! z# m2 m* z{
5 s$ a& s8 Z( ?* V0 n9 S        pRX_MSG_PROTOCOL pshreRAM = NULL;7 f/ y) W, ^) e3 t& a! b8 ~' D+ }
4 D" {% i3 j# G$ S  ~
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
" [' x1 M% |* o+ D6 M8 T  A+ _+ O4 A; k) x
        if(pshreRAM->packet_cout != count_copy)# H  _8 q7 }- e" k  [
        {% {$ f9 e' W# ?3 l
                printf("a is %d\n", pshreRAM->a);
% `( v  R$ }: \0 _* i                printf("b is %d\n", pshreRAM->b);
' e2 G- y& j' W' ^5 V( M' d  ~                printf("count is %d\n", pshreRAM->packet_cout);
# F8 J3 x' O& @1 `/ N3 M' v1 c' M                count_copy = pshreRAM->packet_cout;
% @! `$ W$ U- D$ a/ U9 g        }9 w4 N2 o% K3 m/ {% A4 Z: u5 k
        else
0 x1 S2 e; Z: k; J; r        {
" d( s- ]9 x; |( S9 Y                printf("No effective message!\n");  U/ i3 [$ I% d# z
        }
6 }, l5 U$ S) j7 e# }9 B3 O}$ i, |) _$ A+ o+ K6 Z

) b( Y9 B+ O7 e$ ?没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 c0 K1 k( m9 M: Z  ^+ U) [9 R
% l4 u( L7 O2 }- R: P9 x+ Z8 p8 L
; J$ j2 n7 a+ i8 Y
- e5 c' a/ W2 u5 M0 F" m

5 f  }7 C: C- X0 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-21 02:25 , Processed in 0.039155 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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