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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! k) e( A* [; g0 u& r: l
5 w: p  s. n* e, x8 l- K5 z1 b/ K& Q8 qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 b0 B+ \* ]. j: l& E) m
#include <unistd.h>9 `) {$ C  K2 o6 G8 ~6 R( ^0 Y9 O/ L
#include <sys/mman.h>
9 X& x$ f" Q+ r* a# R! \- w#include <sys/types.h>% J, i, ?2 s1 K
#include <fcntl.h>* O( `) X. w4 E$ O' ]- ~! m$ N
( z: {! ~9 ^* Z! k- H6 `
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) j1 O1 O& R9 F* [& l4 z' C0 I# D* t+ b3 u
typedef struct' s4 E# ~/ X$ ~3 L3 `6 q9 w
{
  `/ }3 Y8 p+ I1 x        unsigned int a;
! Q2 t2 m6 D# q% l: x4 R3 R& y8 x        unsigned int b;' ^9 |1 Q# n$ y1 K1 D% \% e
        unsigned int packet_cout;
4 ?: K% Q* X& t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ d5 u6 n  A" {3 o6 |2 K) M  `% l, D; x' Q/ R5 p' I
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
" Y$ F0 T  q8 J- Junsigned int count_copy = 0;
: U5 x1 A4 W  R* n0 U
% l/ U% S% {7 _/ }5 j" u2 w# n1 ]: a9 b1 b( E7 o
int main()
* B7 w& Y8 Y2 L/ x' C! K8 o  f{9 a8 _8 H7 w7 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;% a! {0 V- Q) K/ K9 R( y  |3 b
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) D5 T/ \$ B# N! T
! }/ Y) E& s3 W1 i7 f7 h8 g
        while(1)3 c. C  `1 q1 f/ s2 G
        {" e4 ?  M0 s7 j  W
                read_MSG_buffer(pshreRAM);- }1 N- e$ C* \) T/ O% `
        }                $ y. u/ h0 o9 N  A$ f' C7 H
}3 Q6 I+ g% ~  ^; G( x
$ ~. l- h! o5 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
1 [6 p+ Q0 T: }- Y% V3 D{% B8 L3 W1 a* R& M4 `- C7 V
        RX_MSG_PROTOCOL buf;
! e# f" P" X4 y+ M+ F4 n        
. n3 @% Q5 e% f) N/ _0 _        buf.a = pshreRAM->a;2 i: j( M1 G9 @% y0 B
        buf.b = pshreRAM->b;
' z- g& W3 B1 A9 c+ B6 z* |/ r% ~' g. t+ q        buf.packet_cout = pshreRAM->packet_cout;9 p3 g4 ]' p$ E7 z! Q
        
! p0 ~5 o/ s  b7 d7 F6 U! d$ I        if(buf.packet_cout != count_copy)
+ ^# J8 U0 H& f5 {9 p) \1 q5 Q        {: ^/ A' M9 M! W  r, ?+ P* Q% n" o
                printf("a is %d\n", buf.a);# e2 w& N: E6 w1 }
                printf("b is %d\n", buf.b);" b, M" s- P, j
                printf("count is %d\n", buf.packet_cout);; c' N, x; S/ ?: Y$ \1 |$ P/ g8 K
                count_copy = buf.packet_cout;/ H6 y: R6 ^8 U
        }
7 R/ \7 B4 O# x  d        else
; X% J5 a' z6 c4 H5 r/ d        {
( l5 h" M6 [. B/ P                printf("No effective message!");
! O5 Y; P8 f9 C4 x" a4 z' M        }
, }- G! f' a, T/ r  B7 Z0 W}
( x4 i# j& ~, {! H& C8 D
1 v( N. L) S& f$ E) y- `1 N) p; A3 e
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 P6 ~3 ?3 a/ }
使用下面代码,对内存使用了mmap函数后:9 c7 Q5 B$ m, g' W. y
#include <stdio.h>0 B0 |9 @  x6 W% {0 v$ X, v
#include <unistd.h>' ]+ J. x8 R+ @8 b# t
#include <sys/mman.h>' b! T$ c& }, J% Q
#include <sys/types.h>
! S# v0 l$ a0 [4 ^$ T#include <fcntl.h>- ^- e0 i: V! o6 W8 z+ J& y8 d" c

" L' B9 H7 |( Q0 `  \' h8 o#define SHAER_RAM_BASE_ADDR    (0x80000000)2 f. v9 y* g7 g9 g  O/ y4 l( X6 U
#define SHAER_RAM_SIZE         (0x20000)   
- ^) F2 B( o. n& Y6 [  [% U& `
& }' s+ \* F& p! k& Itypedef struct
/ d# P( N7 R; r) e5 M+ j6 v7 Z! i{
4 A4 h8 b. G, v. z5 P        unsigned int a;
, T+ [4 Z, g) E        unsigned int b;
3 a3 p: F: h1 f- R! k9 h* m* Q0 @        unsigned int packet_cout;
+ @# j0 U7 K. M; D# n5 c* E$ G% v5 C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 p( g$ `6 ?9 t$ R5 O% k7 g: J
void read_MSG_buffer(int *baseaddr);
1 U- u3 q! r$ @; ]8 Dunsigned int count_copy = 0;8 k2 W' M5 B4 z6 l4 T. T2 ^; L% P
1 |3 S. V6 F% {- A
int main()4 L' W/ R9 Z% V# A0 }: r" L
{0 P4 p% K' @" s; o7 v8 l2 x) O/ Y7 g  A6 x
        int fd;: g; Q" P7 J1 U6 G& U
        int *mem = NULL;
/ C4 d6 G8 Q' a9 h# I
* \; d( o* J' [( C, r% b& [( \6 x$ m        if((fd = open("/dev/mem", O_RDWR)) <0)
, G7 T9 N, w0 A( c1 X4 f  H, {; d        {3 c" o/ @( v) s6 K: ?. w# N% S  c- {
                perror("open error");
; V# @3 H+ M, p  z3 T; H6 ?6 Y# ]$ Z+ L                return -1;
9 ]" @, L0 L; }; g        }/ |$ ^- Z$ c; s5 y1 d9 K0 m, }! U
        
- b% i, A( l1 l# Q) F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& r8 U% x" U- [3 h

4 |) X8 D$ I9 e7 q- F' `        while(1)
+ W# e/ A$ ^6 C) L6 Y        {
9 l/ J0 j+ ~- R5 m5 M$ [/ J9 |                read_MSG_buffer(mem);
" n7 B- J' B: f  |/ `1 z        }                % j4 L, @- P) ~$ [8 l
}
! E9 _7 p# f" {! _; s# {* X- O* W: t% g) C
void read_MSG_buffer(int *baseaddr)
3 {$ G) Z" G5 H2 U{
8 S- C% G  `; i4 C* @        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 g7 `) G# [$ p+ t! z+ B& J" F( Q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 o. o6 r' n  m

( V6 ?# A- A  O% s( K" A        if(pshreRAM->packet_cout != count_copy): h& n! b5 e; A) @% p' ]
        {, |  q9 Q# V. J, v
                printf("a is %d\n", pshreRAM->a);6 x8 u) d. d: k. W& d
                printf("b is %d\n", pshreRAM->b);2 L& X4 |- F9 k* g1 d
                printf("count is %d\n", pshreRAM->packet_cout);: K7 p; z. G. r+ B; p6 U, ~
                count_copy = pshreRAM->packet_cout;6 ~: N& w7 Z7 C5 F
        }0 j2 l: C8 G7 `3 o. v4 {, H
        else
6 P7 {4 ]) D  o        {
' S% W$ H4 Y8 K% R- X                printf("No effective message!\n");
& f. Q# O* e3 d+ z        }
* C) m. |1 S+ m% \  `! ^}1 x8 H. z4 z" Z; i, s9 {
: [% C9 h. n2 |" U" ^
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" ?- V: f0 p# j1 u9 {* b( d. B: n( n. C8 b+ T
* S( u8 R7 t' W% s+ Z# M8 D( M
# ]) Z. q8 ^. m) M, J9 y% L" C

9 q5 G% D3 ?2 k: d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-28 08:17 , Processed in 0.040256 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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