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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , R, q4 h5 p4 I0 g3 |
3 Y, J6 ^8 b. d: B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>- v: {9 J7 K) j) i( W
#include <unistd.h>
* c: P& i8 V" e7 l& O% M: V3 ^% F#include <sys/mman.h>
' t8 b5 ~. H  s. w#include <sys/types.h>
3 Z- X9 X, S$ \$ s; V/ G3 G#include <fcntl.h>. h* ~. i" @0 f+ Q0 e
  `5 j# F+ V2 W5 k* F
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # e4 b5 m7 M& h' }6 d% e: [4 }8 K! @

1 H5 o" L' r1 D2 itypedef struct
& o6 ^$ Q. d. G: \& t{6 v2 e" ~  |1 |4 c! _
        unsigned int a;) }$ T; ^% w8 J; e5 q
        unsigned int b;; J3 G7 z7 }, k  d- J
        unsigned int packet_cout;" p1 `) ~/ |) L" K: s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 X- Y0 S/ _. l. i9 A! ^+ t3 N8 `' R) h# Y5 I% S
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( ^) x: t: e  ?* k1 e
unsigned int count_copy = 0;
/ r: \+ g- }. I" p  F3 o# X( O
- C' k/ q3 @' D2 X4 [4 ]7 ~* n& _/ z, }
int main()7 x/ s& s9 W2 f7 p$ R! ^
{
$ E8 |8 {, N' k# N' n5 e( D, q) ]        pRX_MSG_PROTOCOL pshreRAM = NULL;8 |. r  t3 i- ^
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
1 C$ [1 H+ U/ Y0 b. o, H7 z7 `: M# v1 N. Z5 \
        while(1)
7 G* ~6 }4 M+ J5 k        {6 K! g! a% L, h& b
                read_MSG_buffer(pshreRAM);
' o6 A+ R2 Y; h' S- K% z. X        }               
6 s3 p; x' f9 ?  k7 ]+ ~+ q}  S! Z- k2 x' W- e" ]4 a1 h
; J8 u. {: @# P0 s' Y5 t$ W; g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
/ ?0 b) w0 {0 l& t{9 }" E" N0 X3 I
        RX_MSG_PROTOCOL buf;
5 o2 ~3 [* U$ X) e8 K        
, ~, D+ m9 [& V. p6 U" o2 S; ^4 K        buf.a = pshreRAM->a;
; I1 X; o& C4 L        buf.b = pshreRAM->b;0 \( V, T; h, y5 \+ Z6 N8 O+ p8 _
        buf.packet_cout = pshreRAM->packet_cout;
' w3 ~0 B$ _1 Z% h" ~3 a        / `2 s' j9 [4 ~" r
        if(buf.packet_cout != count_copy)$ {4 S5 G  B$ R; i- @- v+ t
        {
2 {! Y& q* ^3 W- r* c                printf("a is %d\n", buf.a);
  L. Y& V( K8 @5 F+ B- U( r                printf("b is %d\n", buf.b);
7 F8 A" X$ q+ i# B* k, w+ L                printf("count is %d\n", buf.packet_cout);
( p$ C. G9 ^2 ~6 ~9 g                count_copy = buf.packet_cout;8 @2 k. Y# m5 H( F$ f3 I( x
        }, {! G$ W! b) Z- d- E
        else% W1 E$ u# \' m
        {
3 N8 W: D/ v. @+ f% U  B7 H) D( S                printf("No effective message!");
, P1 }, f, y/ r0 [& n2 l        }
- i; `# X1 @; z: _}
9 w" S) p+ H$ J$ E$ |8 x" C; i9 k' C  K1 r

& h6 e2 c3 \3 V2 e; O& F& F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% n! K+ {8 N+ p) n( _
使用下面代码,对内存使用了mmap函数后:8 b* d( n) f$ i4 F' W
#include <stdio.h>9 M  y5 y4 s, M
#include <unistd.h>$ y8 m0 l( W2 B0 ^. D- }* d
#include <sys/mman.h>
- E; a, K' `; i! F) {' R4 @' f#include <sys/types.h>" R; Y8 y2 o5 z
#include <fcntl.h>1 l0 r6 }: |* H+ B

  W3 o8 n" Z3 d#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 R; ~+ S; p2 c/ y  O; r/ U#define SHAER_RAM_SIZE         (0x20000)   1 R2 x* f1 b1 I" e; u
9 N- D2 I. q+ p
typedef struct
: C9 Z7 h) y4 w6 X$ j9 F0 r3 l0 ~{' |  t$ J0 Y, `4 u
        unsigned int a;
( H: H+ S: Q* w% G8 i3 J0 N; \        unsigned int b;
6 f0 h' C: g( p8 W+ j1 _  Q3 G        unsigned int packet_cout;
  e5 k; `! k) ~; K& X+ m5 t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, Y5 o( d, [, H/ t/ G- m

1 P- n% Z, Y8 y2 f. ]; t) uvoid read_MSG_buffer(int *baseaddr);1 |# v( Q" l- N9 v% C% y6 V* _, |
unsigned int count_copy = 0;- S+ a/ U2 a  N; ~9 F
8 k$ D; Q2 y% x# l3 Y3 a2 V) v
int main()6 u  ?  h- S. k6 A+ Q: `- y4 C+ X
{
1 Z/ Q- B  f9 p( s1 m. N$ E        int fd;% ~% L$ z+ f1 Q. B9 t/ a( n
        int *mem = NULL;
: |% f) j# q0 s) T
) A" G; n) f9 D/ h        if((fd = open("/dev/mem", O_RDWR)) <0)
$ q1 u: b6 t" R! p7 J+ C        {  \% s# Y; ?% E3 G2 ^$ H
                perror("open error");
. h. R  q) u, [                return -1;
0 d' Y: z- L* X+ Y' v) m$ X        }
/ n8 ^# h* X: J! k( `9 T, \        
/ h  o! T' A$ |9 N1 U$ t        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 V  g9 q& {0 Z0 s4 I* V4 f
" M2 j  e; X: U! ~4 ]) h" _
        while(1)
! k2 w# m: x% n- C( t- a" M        {
) S( d  O8 m! z                read_MSG_buffer(mem);- Q: R3 N8 Z* e6 D
        }               
0 V% e) A0 j8 d; z}
+ `* c0 Z! _+ i; o) I- f6 {
- ~, k% P, L( f8 ovoid read_MSG_buffer(int *baseaddr)9 q3 c9 u/ ~: K6 @. M* y& F- s: s
{
. v2 y* H5 X' b- n        pRX_MSG_PROTOCOL pshreRAM = NULL;
. j+ `4 o, s* o! P' g" L7 _* I$ n
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: z7 b! [' g: R& r: @" d  j0 b$ A! G+ G8 K; _( x) W
        if(pshreRAM->packet_cout != count_copy)
1 k" \" b* j% ~! f4 i8 f        {
* c3 a; N/ Z0 b1 L: W4 x( [8 P                printf("a is %d\n", pshreRAM->a);  Y1 E+ n/ m7 I3 i/ T% _+ |
                printf("b is %d\n", pshreRAM->b);
6 I! g: @, r7 ~3 q                printf("count is %d\n", pshreRAM->packet_cout);, ?3 i* P7 L8 B3 C. Y4 u" a
                count_copy = pshreRAM->packet_cout;
* c3 k9 m3 W1 w* K' J% T        }
( Q3 h1 L* E3 S* U        else
  m0 g8 M6 q# t0 b7 v- @        {2 q: h* J6 W/ t  q  T
                printf("No effective message!\n");
+ f' q6 u5 s$ ?$ u4 H6 g; e5 `        }7 I+ z+ x: D% `9 d
}6 W- k: f, B8 J# d" J% I
8 v7 e; G0 m* l. c# ~1 ^7 e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" {: l* r" v# Y. b$ D  J) P* Y. g# [( ?- Q& J) _5 R) o

2 V/ U9 N- X  G! ~! M7 b/ {/ Z: j- d7 S( W7 ~+ `

8 ~0 I( A! _( b  x6 B/ u0 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

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

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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