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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
. t" p. E: C( |/ j+ G! i5 S2 m, h
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 K$ j8 ]* A# s5 `$ n#include <unistd.h>
- g8 p2 Y$ @  c! _#include <sys/mman.h>
2 S, c8 ?! k9 t7 a$ j; _9 N- r#include <sys/types.h>
* T1 M; i& T& L- N  J3 F6 ^#include <fcntl.h>
0 y8 t* r, N* |' l7 C: {; j8 l4 M( k) u* I: V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 F; Z0 G- h7 s5 P( \
# K' m1 U3 ?9 r& Y, S5 H" Otypedef struct
& `! W; x' p6 E1 R; p" e( f0 q{
$ Y, k+ X$ A% ~( d+ C$ d        unsigned int a;! A; o8 Z- V1 E+ R& S7 r" {
        unsigned int b;) P* g8 e6 c; `9 b3 i
        unsigned int packet_cout;
4 i% ~' E6 V: a0 `}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( b! t' V- K) L' t2 B
  n1 {/ ?; f  t! cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: ~' N* g# {; H% Kunsigned int count_copy = 0;, A3 W% o; Q8 _, ?7 U9 U

6 N) ?  O7 n1 H( ?( c: f- [* y$ K, a' y. [( U
int main()- X4 T2 O3 p; Z! |0 M
{
+ s1 v8 @6 X' |! J0 U0 i" w7 `  u  u/ I        pRX_MSG_PROTOCOL pshreRAM = NULL;3 m$ |% C8 L8 N, S9 I( ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* o; x, i' r6 e8 f3 E% T$ W+ K# }3 T' d0 \
        while(1)
( R. z* V4 }1 Z; U        {
# e/ `/ z. R- _( x                read_MSG_buffer(pshreRAM);, }8 v; v+ \8 X- L& |, ]: k
        }                * E! G9 U- ?6 ~, X$ B9 U6 D& t0 ~
}
6 l2 L0 `0 ~5 j" d- o+ Y
: Q+ m9 D# U) L1 Z+ R6 {- [+ ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( A4 O/ l! a! [* o4 L! s{0 E6 C' t. V( t9 y6 }, u
        RX_MSG_PROTOCOL buf;
; @8 n% v2 I; x+ y. m6 z        
2 w. C. t( Q- [3 g4 C9 _        buf.a = pshreRAM->a;
! {: @# v. E* d        buf.b = pshreRAM->b;! f. O8 k3 b( p
        buf.packet_cout = pshreRAM->packet_cout;
& L- l: W+ `! j0 X: M        7 Q2 ^* o/ s2 d/ M% g, i6 _6 G: E
        if(buf.packet_cout != count_copy)6 l! X* b8 ~' Y0 K9 P* x
        {
3 o9 t4 {; X) G+ w9 t) U% w1 K                printf("a is %d\n", buf.a);
6 o4 m* D' O! z5 b1 s                printf("b is %d\n", buf.b);! p9 e2 C! D6 Y+ E& U* I& T! }
                printf("count is %d\n", buf.packet_cout);+ l+ l" O# c! `5 x, D% e1 e
                count_copy = buf.packet_cout;" O8 J0 z2 ~$ x/ p& O8 k
        }# a. c3 V2 P* L% C3 Y0 X% V
        else7 }0 r6 a9 c+ V
        {
  j, J. `/ s( ^$ E: ~* a                printf("No effective message!");
/ l" y7 [6 p5 X: Y% ?, D# q4 s' |        }
; V  M1 l) R/ w! ]  [8 {}
$ o( m5 {; O) w  N4 |1 h3 b4 `$ [$ M  \) |+ r; K

8 d) T' e" e4 Q! r7 x/ F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
+ j& R7 u  ]6 K# V; A使用下面代码,对内存使用了mmap函数后:8 |# s' ~$ C  B7 j' E( @; L' `7 T
#include <stdio.h>
/ O" p' s# B/ A: d! P% h#include <unistd.h>7 ^0 n" i5 @% i- ^
#include <sys/mman.h>( d6 M: S( @) g3 @) |! q3 q! ~
#include <sys/types.h>
4 D* a; Q! c' j) s& U#include <fcntl.h>5 M8 ]  P' F4 M3 x8 Y& d5 |3 v
, r7 C' m9 H/ o/ g/ S& `7 I
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 o& `! D2 }$ ]1 M9 j8 ~# M4 ]% y
#define SHAER_RAM_SIZE         (0x20000)   
  y$ N* v7 t& A7 D, B1 ]0 f1 c1 J+ M/ i( ]# {" |
typedef struct
& a7 A# u, l3 d/ g5 Z{; C! N9 V. k6 N# P
        unsigned int a;
! i7 b; [- q" F9 \4 L, x        unsigned int b;
  R5 P/ K# ]- r/ V  j  }        unsigned int packet_cout;: ~0 [# F  G$ T8 r) U
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 Z$ L2 d# [$ s, P7 r  v4 V) ?6 @
void read_MSG_buffer(int *baseaddr);
3 M; P0 u  M* @0 r! Vunsigned int count_copy = 0;- `, b7 k! m9 w9 t8 X$ c
* v8 A! W0 A. s$ t
int main()
& V- b& q) i" Q/ T; |$ P& f# p$ S{. @. l/ Q) {" r2 J+ S; |
        int fd;
4 x# W* o1 @7 e7 |        int *mem = NULL;
, V  g+ k% R+ f2 W: h4 l) S) d% ^/ j1 X  n0 A$ V4 b- @7 |
        if((fd = open("/dev/mem", O_RDWR)) <0)
, h0 }8 ^- ~: n+ z0 k- N        {
9 y0 E0 b( ?4 c1 A! p4 n0 B" `0 a                perror("open error");3 W. \: d' L( D& l  Q
                return -1;* I7 o, X7 j7 a8 i% [
        }
& c& R6 I6 D' G8 X9 N2 Q1 h1 n        
$ B, H/ t1 d8 f: O: z6 I  k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 D9 v; Q! S- o; r( a
9 T( z$ H9 N. y4 G; R
        while(1)
- S5 P) e8 K9 S# R  O. C6 K        {) e2 q7 ]/ _" p9 q
                read_MSG_buffer(mem);
5 v7 d/ O& l+ g0 Q& u7 E4 \        }               
8 Y% h1 U1 [: ]3 O& D, G5 p}
; T. E) ?6 l- ~5 m5 T& Y# e+ K( f! H1 E2 x, N) ^/ Q: }, S1 y
void read_MSG_buffer(int *baseaddr)
/ j7 I) ~  U( I' K8 b$ H{8 u* J) \; e2 Z. o3 a/ _
        pRX_MSG_PROTOCOL pshreRAM = NULL;' ]* g# Y- d9 d' ~
9 h5 B( C8 W3 T0 B' u# W, Q7 Q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- H" o4 B) T) `, \" W* i7 u, U
6 Z' e. w# c8 g6 c, d% p
        if(pshreRAM->packet_cout != count_copy)5 a3 m5 o' E+ P) @+ [/ j, {
        {
& @" J1 g. V; O/ f3 U9 w4 s                printf("a is %d\n", pshreRAM->a);1 j; J) i$ e- _' x2 t2 E% P
                printf("b is %d\n", pshreRAM->b);
/ F3 Q+ s: z+ P- A0 }                printf("count is %d\n", pshreRAM->packet_cout);" S; H" Z; p9 \/ l* l# O1 A$ I! Y
                count_copy = pshreRAM->packet_cout;
! P: s; ^0 t5 U2 i        }" T5 w& i! L- v' H1 _, o+ F4 I) I
        else
1 ^# \8 ?; ^; @, H* W        {0 q1 W' E" P* |
                printf("No effective message!\n");
" V5 X3 g, S; K+ j( i. ^# z# Y# }        }) v$ `- r) N" S9 k4 ]- H
}
* Y2 J% Q: E# }2 T$ s$ k% {8 w) @7 l5 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 ?6 u: e8 _- V- F$ u0 [1 j; `! ?4 p. F/ U
( F* g$ u8 _9 U+ m9 v) J7 O4 r
# E' [4 ^" k$ r$ O

/ g  z' X+ f* A; g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-8 01:21 , Processed in 0.041509 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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