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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 m9 X2 P4 @# s
6 y1 x/ c) `" h- b* ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 g" I: u3 n" S
#include <unistd.h>
) C, h/ i9 N% e' ~" [3 }- M#include <sys/mman.h>6 e1 Q- ~) _+ q# F* o+ u9 S
#include <sys/types.h>
' E$ z' e8 k2 x+ e+ j% B5 p#include <fcntl.h>
. u( f% Y) _. b0 C' ?4 }) r' W( Q2 v* R' A( [9 V1 |7 h2 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
5 x+ u' b; v0 `: }
1 \9 E4 g5 U; O1 i7 ^! M( K% Ctypedef struct! p. C- F7 d" x9 s6 }% x/ g3 l9 o
{& }1 ~9 R7 I; f9 w/ H: G8 N* N
        unsigned int a;
: s7 _" G! q" m9 A        unsigned int b;: s* A' N- ~8 g3 p3 H$ [9 r( ~
        unsigned int packet_cout;1 S( i. S4 ?8 i- C- X6 ^3 ~& N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 \3 M8 F1 P- S! I8 U1 o
- n; ~1 F9 W2 d& T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ }1 J$ |4 H* t0 ?- Yunsigned int count_copy = 0;
! i5 N# E5 E  w* K3 K
* ~2 x+ N' e: ]  p, r  i. j1 K+ _3 Q9 R; f1 h7 `5 {% n
int main(). x1 y# i; w6 T
{
* L0 i/ T" Z! D% T' q- m+ X        pRX_MSG_PROTOCOL pshreRAM = NULL;4 h* {! j4 _, B9 X* h# T$ }
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
( r& a8 L5 K: @1 A
# d) k4 o! e: L0 x        while(1)3 y! X8 ?! {5 r9 n- n8 X, U
        {) l* {; D7 Q/ H3 q! f( h2 c5 T
                read_MSG_buffer(pshreRAM);
3 d5 E5 _# y! v& ]3 v' m        }                ' _( `! Z% d6 p: ^6 z* O" _
}
  M/ t9 M# y& H! C# q9 b. Q* I* t( t) V: t( t' G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 {4 V. L. K$ _4 ^; }{3 e- y  ^- y8 w/ o7 `+ x  s
        RX_MSG_PROTOCOL buf;) g' m# K9 p, Q+ t9 t6 Z/ o/ ?1 d1 R
        
- O) \; O6 A; ]        buf.a = pshreRAM->a;
, w5 ]0 n: D( D: ]$ g        buf.b = pshreRAM->b;
; t8 ^3 h' u5 ?  |9 A! U3 g        buf.packet_cout = pshreRAM->packet_cout;
$ ^- ~( H3 a  w, c        ) C3 T0 m) I8 K# W# N% Y3 A
        if(buf.packet_cout != count_copy)
/ u3 S! ?8 E% }4 B% t( n        {' \: j" u( K2 C7 ~8 I+ Z
                printf("a is %d\n", buf.a);7 G6 n! j' ]& U8 c. p1 v( B$ N7 x
                printf("b is %d\n", buf.b);
  _) l( e# ]' `% I6 P                printf("count is %d\n", buf.packet_cout);5 x) T4 W3 {$ z/ G4 C2 N
                count_copy = buf.packet_cout;
# _; T+ m& H  K: d% ]7 v9 _        }3 s* m! f  B6 j1 u: N5 h7 i) ]& o
        else' D5 F, C' j2 `3 y+ T9 {& q2 X
        {
4 ~7 O) d3 ~4 T7 F3 q                printf("No effective message!");# Z7 Z6 G! G, b6 o2 z
        }$ ^0 |$ r' u' v# q$ a7 h0 j
}
6 z4 C1 j5 T2 i* A/ m% @8 t
7 t4 l3 ]/ M# m) n4 {% M$ Q
% }+ }- N5 l5 {' t( ~: r3 [- I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。( t) V0 l; M- h1 y
使用下面代码,对内存使用了mmap函数后:
. l. I7 F' B& ^! s2 [#include <stdio.h>
1 U: o2 w: g: U4 |#include <unistd.h>) }1 J; _+ C: H* R
#include <sys/mman.h>" e; Y5 i- r! C* R
#include <sys/types.h>
% q; x4 @% b$ ~2 z) {$ F6 h' O#include <fcntl.h>
% r9 K# x, w; X6 r
! F& e! D; }. I6 S3 \/ U#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 b. f/ O9 Q& v5 T6 q2 f, m#define SHAER_RAM_SIZE         (0x20000)   
! S4 |  Y, k. _. `- ?) T2 H  M% b9 H% N! V. ^6 X7 c
typedef struct; V2 @4 Z" H7 v. U% J- e% y
{
; `- n" C7 f  A* K, Z0 T: ]        unsigned int a;
" }) I8 F5 D, K; A1 ~$ j        unsigned int b;. N$ A% y* }7 I3 t- x  l: m1 ?
        unsigned int packet_cout;. R3 W( ?) h+ r$ y, c' \
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, |% S4 a( ]6 K

9 u& {  c; |& I9 W2 Jvoid read_MSG_buffer(int *baseaddr);
% s, `$ O1 c8 s( M% I8 kunsigned int count_copy = 0;4 w# o" M, f: Y& I
; d, A8 b+ N/ I7 i0 ]4 e
int main()
( O' S1 m: D; ?3 R3 u; P2 j# _{$ h" R! {# F5 |  E
        int fd;' y( D4 n: c) l4 ^) [' X9 m0 h/ s
        int *mem = NULL;+ }4 `. J* ]6 @' g# b% R

" ~- F! ], w# [5 Y        if((fd = open("/dev/mem", O_RDWR)) <0)) A3 K) |8 o. B% g$ ^
        {3 A) M3 p: {7 E; W- L
                perror("open error");
- {( V; I5 l$ b* n8 C" F                return -1;
1 P8 g$ u" h& F& k, y5 T/ D$ g9 o        }
' b; s# l: M- Q' Q% b        
4 t4 j. j& g1 f  s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ A* r+ X$ b$ u6 x1 A; ?: B" a& _  I5 l2 D, `/ p% |
        while(1)) c. b" F$ c8 p# \" D. ^0 f, `
        {
& B  ~; s  W( f$ s  H                read_MSG_buffer(mem);2 }$ `% k! e( K6 q- f
        }               
/ J7 S; X& D1 `8 V- L: S$ B}
0 @- D8 L. V; n) t, V
$ t: E4 u# Y6 c& T" I2 g. yvoid read_MSG_buffer(int *baseaddr)
* _4 y2 W5 r$ z  `( g) u{
  e. m: L& S3 t2 g9 J" [        pRX_MSG_PROTOCOL pshreRAM = NULL;5 a0 K1 C; m. l0 j9 t7 u

/ A9 A* {& L) e  p" o+ v6 G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* ]5 q8 h, c+ T: n- T6 c" h
) D0 @4 [( L* x1 P        if(pshreRAM->packet_cout != count_copy)
; d% T, [) d- e$ J  T( Y        {8 I/ q& [) L( y" z% o
                printf("a is %d\n", pshreRAM->a);( a- t' Q* A5 T. T
                printf("b is %d\n", pshreRAM->b);. M( q! q) H* ?1 u1 `2 j
                printf("count is %d\n", pshreRAM->packet_cout);% R! r' e5 t# |+ ^2 @
                count_copy = pshreRAM->packet_cout;& J) r$ l$ N9 {! ?  W
        }6 g/ _' \5 C8 I/ ~3 c6 d
        else7 x  R6 \, a3 }2 s$ s3 A. a  _4 u
        {
/ h. N6 p5 `! t0 A7 i0 h                printf("No effective message!\n");1 j9 |9 I, Z! T
        }
) k! y, H% a% U( B}
$ F/ }" @% Z) v: S8 d* c& l! o; ~$ U6 h/ Z9 G; ~
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???0 \" ^. \  Q0 C) D9 E
) Y( I8 u6 n: L4 z
6 W6 ~5 B1 b) y) c$ O( A* T" B
: U- c: B) Y; v) b& p% I2 G
$ ?' y3 r/ p  A) ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-19 09:30 , Processed in 0.038146 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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