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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 A1 N  ]. k* }" ^- H9 R

! M) k- W9 F! ~& cOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 b5 H8 M  V8 q' L" l% Z- _) x
#include <unistd.h>
4 m. g7 P# g. j  l7 ]#include <sys/mman.h>; m2 e$ {8 O; ]
#include <sys/types.h># r6 N& K7 z8 `6 m, F6 y7 {$ h/ ]
#include <fcntl.h>* D( p6 f/ V9 u3 I5 a9 J

) s$ j4 B+ J1 @) {* A( e2 \#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 S" D: M  U. |; K* a+ _' A2 L4 z. J) [% Q: d9 F
typedef struct  n6 Q& t7 I0 U) u) i
{5 G6 [9 u/ j  Y
        unsigned int a;" m& S2 ?* j9 G% g
        unsigned int b;" ]9 t# I, K4 c. Y
        unsigned int packet_cout;6 z6 g3 Y/ ]* z1 R% R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 z, e+ x4 y, p" w& I' h* @: ?; J
" y2 R5 m/ q/ |, M' Y3 Yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 ^3 U" A2 r4 @. G; Xunsigned int count_copy = 0;9 C0 Y8 x9 v1 G/ q; g
. @) d) m* d: k+ J

0 k8 w! b- c( v/ @int main()3 e7 t  A5 d( D$ U! {8 K
{
! y7 p  x. i5 E. |% w0 c        pRX_MSG_PROTOCOL pshreRAM = NULL;3 ]2 @' A+ S6 |" b5 c: D9 r/ R
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: w  N* g2 S' o7 ~% r& U0 T9 b# U
        while(1)
9 @& _$ Y2 I( {: d3 X        {" i' F8 N$ k# a9 `' ]
                read_MSG_buffer(pshreRAM);
, n1 ~1 O9 y7 _% u; a# ~* [        }                8 B" U9 d/ y% @$ c! g
}3 J( `5 A& p( p& L/ q
- ~3 u' l; f- V$ R5 B6 m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 I- t/ O3 Y; c% q0 j3 J
{
! t4 W. h0 c) U. D* m- X        RX_MSG_PROTOCOL buf;
: G% Q+ [4 ?  Q3 ?/ ~        # D% w; T: `8 b" e) |
        buf.a = pshreRAM->a;4 M& n: n, U2 F) v( R" f5 e! c7 W
        buf.b = pshreRAM->b;
" F' N9 O& }/ z( j1 h% y        buf.packet_cout = pshreRAM->packet_cout;
6 s5 A3 Y0 U+ Q; T        
  F$ ^! `% b, [9 C8 U8 O# s- o        if(buf.packet_cout != count_copy)
9 n9 I$ R1 ^: t) ]7 d* A3 W        {
' M' a+ w* ]7 z; u% h$ m" X% w                printf("a is %d\n", buf.a);7 ?3 q' N. {+ c) O  H- T: z  h
                printf("b is %d\n", buf.b);
7 X6 L1 @5 d6 @: I3 O, B) ]+ l& ]3 j5 u% G                printf("count is %d\n", buf.packet_cout);% D9 C) k7 d# d4 E6 ^
                count_copy = buf.packet_cout;
# W3 E7 E2 C  A        }
2 W, }5 `4 `5 ^; i; k( }0 ^& [        else' H1 }1 i2 {& l$ ~: i8 L: J" W+ W4 U
        {0 q% ]% p; d- e, f4 p
                printf("No effective message!");7 O5 ~% I$ W* H9 j
        }, d  ~9 L5 }: |8 I+ ?' D2 ?- v
}8 S& K# j! s. w

4 _8 ?5 [# d& b6 l
& l) K4 {8 h9 X6 a6 |& j% `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ Y( X0 [) u. P: ]0 L; H使用下面代码,对内存使用了mmap函数后:+ ?& r4 Q7 G7 _- r' o' K
#include <stdio.h>
- E0 m2 n+ `+ I% }* r- N2 j6 o#include <unistd.h>
) w) e" h% S% Z( i#include <sys/mman.h>+ ^( w) N! j* p$ b, A7 C
#include <sys/types.h>
; ?' V4 K, w- r#include <fcntl.h>. _: K( c0 S) z4 u, ^

* i! j. ?; ~' a; n7 o, p#define SHAER_RAM_BASE_ADDR    (0x80000000)6 a$ Y' ^4 a( P6 _9 w  `
#define SHAER_RAM_SIZE         (0x20000)   
5 n. q0 `( A( M  H# d( ]) Z" o/ \$ e0 l7 N! {2 @
typedef struct
. g) T9 h9 _; z3 t0 h. R{4 W& K, m; l4 h
        unsigned int a;
( ~/ m0 t" c+ j7 L; `' E        unsigned int b;$ O/ F& o  q9 E, ?, i
        unsigned int packet_cout;" N# F9 X( h  R' c( d
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 V5 p) _" g" z6 w8 X. W2 E4 o, B) m' V' b! b) q* t
void read_MSG_buffer(int *baseaddr);# F5 l% V8 J2 b6 z* U
unsigned int count_copy = 0;/ z0 X1 Q1 c* l+ h. E2 O. K5 j
* f$ e7 Z% A' J7 Y' K2 ~/ r
int main()" I) s7 _# r- y5 S0 u
{$ X( j: C2 W6 p' R' Y
        int fd;
1 c& I! X. Y5 b5 @. y$ d( W        int *mem = NULL;
7 X' |6 O5 [& N  ?/ V5 @8 a1 j
; D' |( `6 e) }% P: b, S9 t9 n        if((fd = open("/dev/mem", O_RDWR)) <0)
3 Z! Z+ Z3 }* r        {
" \" r$ z$ H: }# G) d  ]8 p  @                perror("open error");3 Y3 z' [, ^; \( d* S  F
                return -1;) R* x* K) B4 P
        }9 p5 f$ f) N2 p/ t# L
        ; C; {& {2 h9 F  \# I  v! [- e
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* b2 p0 r5 C" S6 z6 [

* n2 g4 P0 f, w7 O, A0 b        while(1)
8 ?8 W: m1 m, V  |        {
9 k4 ]7 Y. N! b' l4 A" {                read_MSG_buffer(mem);* q& r4 K6 ^0 p9 \
        }                ! f) o# S/ X' O6 b: r" |
}
, Y% R; w% L* S" S
" t3 L- r7 p6 _void read_MSG_buffer(int *baseaddr)
& _6 x9 E( e0 s6 }) R  e& V{, ], N$ M5 x& W3 J8 t( _
        pRX_MSG_PROTOCOL pshreRAM = NULL;: M+ X( k$ C2 B% Q2 {1 z! a

8 P+ P# H. c5 O3 w        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 ?" P! T5 ^8 e- X6 L* c' j/ Y  F
! h! u/ k, K$ D
        if(pshreRAM->packet_cout != count_copy)
8 ^5 K! G* T2 o& D        {: y8 Q2 a& [; _7 d7 L. H6 R
                printf("a is %d\n", pshreRAM->a);! j% `% a! R* N/ A/ T. V
                printf("b is %d\n", pshreRAM->b);
8 ]; `' B. g- t                printf("count is %d\n", pshreRAM->packet_cout);
0 ?! Q. o7 f2 k- l                count_copy = pshreRAM->packet_cout;
9 y0 V+ w3 ?# x+ E        }. a. q4 E4 e1 F3 x+ p2 i0 E, O
        else- Z/ C3 g- S4 M
        {0 J6 x# p5 ^* T7 ^; q# J/ V
                printf("No effective message!\n");
( m! _) X0 q2 T( L% o! I        }5 C2 F" D, X- Z# U6 c
}
2 {- m0 W/ Z( w1 Q
9 @6 N8 o/ v" M0 n; Z- p$ S" a5 U% X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 e7 j" h7 Z9 @/ \2 K8 i
6 M3 x! V9 Z' B( v
' I0 y  [6 t; n( \. a1 b; q  N& I1 J, v* {

# }( Q9 C' I# I! M; k! i6 G+ \  l5 s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-23 03:56 , Processed in 0.058339 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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