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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 * p/ s6 y4 q& U# j8 M: l) `
) r8 H3 `' w/ u8 _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 |% X, c# ~1 T. w
#include <unistd.h>7 Y( ^1 C4 O9 o7 U9 O4 ?/ O) T
#include <sys/mman.h>
8 ^* w1 B$ c! x; w, \; j2 ]#include <sys/types.h>* i  T. {/ T/ w- r. I
#include <fcntl.h>0 e$ |6 s2 Q9 x6 p8 y8 c( O
8 ?* a( `6 i# @0 h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ' P7 \# \* }; h4 r  u' Y

$ ]2 @/ f$ y5 p; K, Atypedef struct
. G6 c: B  n" f: O) r5 @{- l( T. s. V& d$ A# H
        unsigned int a;
! L0 a; O" X) i! b% H0 T        unsigned int b;
5 E4 m: s7 g; G) @6 R1 Q        unsigned int packet_cout;" [' O* i: @% I& b& Y9 _
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) k1 z( f0 [  P% L* T$ J5 T( _# A

  I( V; {- u6 ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);$ T$ J; i1 I. h" s  s
unsigned int count_copy = 0;
+ D$ q, J) k4 G6 S. P+ ?: T# g5 N7 p
& F$ |% Y( w5 n& N" {
int main()
+ e6 R. w) o7 V! k9 J2 i{$ u6 }/ }% F/ _$ j6 G# q0 R7 @
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 b$ M2 E" Q- I. \+ ?6 ?/ o& \
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 T, u) ~2 _/ d
7 ^$ k4 g; i! J( R        while(1)# W, @9 d; w2 r) }
        {1 f2 p  f/ o3 ]
                read_MSG_buffer(pshreRAM);) B9 W4 V% [. {8 \3 U5 ]% X" r
        }                7 ?+ `8 _0 o: G; L
}6 J3 C9 p  |; D

, O0 N  N' p8 |void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 z6 O0 \$ q; ?
{6 _) l* z8 y" b$ U$ [* V% Z! f, Q
        RX_MSG_PROTOCOL buf;
8 P' Q" H$ l0 C        / Y1 Y1 r$ I7 _/ b2 e$ s6 C! @1 j
        buf.a = pshreRAM->a;& O) T+ Z) ^& N' O/ b
        buf.b = pshreRAM->b;) o8 ]' u/ `6 g0 U' u& ^
        buf.packet_cout = pshreRAM->packet_cout;
0 z/ B9 {, C7 k! d, a% q* p        + x; y) B* z7 }% e( O- k
        if(buf.packet_cout != count_copy)6 H' c; @( M/ |/ K, \4 Y
        {+ J% n* O5 `2 ~2 G1 D
                printf("a is %d\n", buf.a);' n; O' j" V% u) l! Y3 C
                printf("b is %d\n", buf.b);
$ {2 x: V! p9 M3 t                printf("count is %d\n", buf.packet_cout);( u/ X7 v8 O- O: R0 A5 _
                count_copy = buf.packet_cout;
( P; y4 {1 N' q9 [6 |        }
2 I9 b* Q: g0 W) G        else
5 Y: E% [* w% `        {
- k& K7 v* M2 k: c8 M                printf("No effective message!");
( q& n% V) S/ o5 a        }
3 K) L; S+ [6 l& \* l& y}1 d* g. W' G" }# t" O* A7 ^  N
9 Z' o. w2 f# [# g8 e
$ v& @# U" B+ t0 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ T1 I& R: D% u. H
使用下面代码,对内存使用了mmap函数后:
* J. U5 {: P* N' {" v; K#include <stdio.h>" d% B8 d# _, ^. u1 {1 z. x" W% E
#include <unistd.h>9 c3 \. G  x$ h. G; j
#include <sys/mman.h>
1 j/ X0 c  k3 Z# A1 k8 @1 A#include <sys/types.h>1 ~6 A  y3 z; V
#include <fcntl.h>
3 U; v+ V: I/ ]* d# V
( m; K6 t4 }% \#define SHAER_RAM_BASE_ADDR    (0x80000000)0 R2 o0 @* @& I
#define SHAER_RAM_SIZE         (0x20000)   
4 L) A* t! R( I8 o8 I' t% g$ Y1 C2 P7 d: z/ E0 ~
typedef struct8 K: m8 J' u. n/ [( E9 x* V/ ^
{
* ^% o$ `. s% n* y( ~        unsigned int a;/ a" S. M& U2 D1 Y
        unsigned int b;
1 O) C3 Y' ]3 a& x6 {        unsigned int packet_cout;( [" f% O& M/ t% Z; _4 H2 x+ d( f. P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% m9 x( ~! S0 w! I3 X; f2 `. r1 A# H
void read_MSG_buffer(int *baseaddr);
# A% ~' f2 ^6 e9 u4 B! hunsigned int count_copy = 0;
2 b- z4 u- ?" u; Y$ m/ d3 \6 Y8 r& s$ G4 {4 b
int main()
8 R! R! T" O2 q7 }2 S{; g4 z. K* S8 c/ B# v" E
        int fd;8 [# K  Z+ _9 ^9 U; ]5 i
        int *mem = NULL;
! i( H0 z1 D) f5 P8 M0 }! I  C3 u- J& R. g$ F' x! o: j9 U8 V
        if((fd = open("/dev/mem", O_RDWR)) <0)7 M6 ~- O% l1 Y9 q! o8 ?
        {; D/ O3 n- a% |: X  o* I
                perror("open error");
0 V6 ?0 j/ L0 ]                return -1;4 j! e6 Y& I& C, f
        }4 K7 M0 ~" D( i, m" G" A" i
        
2 F; D  S9 ]! A, a. F' b5 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& S- i6 `' o6 Y, L: L! H, Q7 J3 x$ A
' C) X( G9 O6 t( K' g- S! z5 d" b        while(1)
) Y. n* L% p  Y( Y/ k" r  O        {, @( q$ x( J% P) j2 W+ r
                read_MSG_buffer(mem);
3 e- J2 S  c" L6 T5 v        }                ( I% A* y( e9 ?
}9 E! i; Q1 s6 v. i: Z5 ]& N; ^

* V& P; p  \. r! ~void read_MSG_buffer(int *baseaddr)
1 S- x/ c8 u8 ~, F- C0 i{/ h: [4 k; L2 \* f  Y) U2 V
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 J5 x0 h1 a, S, i4 D7 o6 t5 P5 `: M9 F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* r) C6 E# b9 t3 N1 x+ g; X' P9 L; N" h' t* Q* G! f- h, S
        if(pshreRAM->packet_cout != count_copy)
) v6 i% o7 Z/ r/ q. t        {
) `' [; E/ {9 d% T3 Y' ?                printf("a is %d\n", pshreRAM->a);
% D/ a# q0 B( l( @6 o0 `                printf("b is %d\n", pshreRAM->b);2 t4 b' x7 P% U. _2 V, E
                printf("count is %d\n", pshreRAM->packet_cout);
: v: C- z; J4 p3 U& y8 d                count_copy = pshreRAM->packet_cout;) k" y, q6 ]2 A% H' Z+ B# Y
        }3 X( j5 @* L, _; h2 i+ P3 O
        else5 {( F. M# ]/ ?& r$ U& P
        {$ r: w% O; x) ]" _7 _
                printf("No effective message!\n");
* V: N# h" Z3 r* s0 \) U, Z        }
; g& {  M! D* B4 H. A}
. x* ^" h; z( W7 ~# m+ c8 W+ a8 k- C" _3 J2 {" a. g! f$ T. i1 c# }$ p
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( p5 Q0 M9 J8 k. t. |& W, [5 O) ]1 T' b' [

; u& |- k! N1 D/ O- _" T, w8 g9 E
. \3 G) U& h  l7 I0 l6 s, J; \7 \& c) @  G% p) {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-27 19:22 , Processed in 0.044221 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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