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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ I, z: r+ m5 P) _+ S
3 y  g/ Z+ }  F4 J( `5 N7 b
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& {1 ?" @/ X: C. w* k5 k: {#include <unistd.h>5 u2 p, g) @4 D3 z* V
#include <sys/mman.h>1 b; r0 W$ J: i: p
#include <sys/types.h>* a& t+ m  ?) H7 F! T
#include <fcntl.h>* S- m! t* r% i. J9 x

% x5 x, ]: s7 Q+ ^1 x2 ?#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 l: B9 r) Y7 ?) r
3 s0 |5 y2 F/ S2 Q( gtypedef struct
1 {) N+ ]: h3 ?1 e{
! S- f# Q4 r* V' W% s1 d        unsigned int a;
- U! T! b9 A& b7 Z        unsigned int b;* p/ r! ]; X, ]. j) O
        unsigned int packet_cout;) F3 P* K8 _& P0 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% |7 q# `/ ?* ~& w5 o! @( c9 R/ a5 B
$ g+ P; }2 P* p
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 f( Z) V8 k) z
unsigned int count_copy = 0;
. ?2 V6 V. r% m, y
& r$ v) p: a: m+ B' {( @
* f) m5 k/ U. x0 Nint main()+ V+ g3 N% u1 q9 k! |$ _: d! h
{
, }* o3 P/ ^; H6 G! X        pRX_MSG_PROTOCOL pshreRAM = NULL;; S9 N. t6 s$ i; G: W
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 y# S$ ]$ @3 x. M# T+ e4 v

: `+ N' `( v2 v3 Y" F, r1 }6 j        while(1)
$ [9 f2 M2 N4 n        {
* }+ m6 Q! h3 O                read_MSG_buffer(pshreRAM);
! k3 R2 z; V/ F& Z$ [9 s& y8 j        }               
6 }' @# @+ C$ X0 B) e  z' s8 H}/ v* ~1 S5 ?( g& z0 U; \) y
8 h2 n3 c2 F% {$ @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ F5 x0 G9 ~1 ]4 _1 `! _
{& b1 g4 K' j# A  n8 |: i' M" O
        RX_MSG_PROTOCOL buf;
# U$ N* ]7 [9 I# Y: S: L        2 E( q0 q$ W- W) P2 P
        buf.a = pshreRAM->a;
% Q' D( N5 D# J* A8 q* P        buf.b = pshreRAM->b;
" n' P+ }2 @/ j        buf.packet_cout = pshreRAM->packet_cout;; d3 ]1 y, F" \; Q8 Z8 d3 M9 Y% b- J
        5 T5 z/ K  Z0 X
        if(buf.packet_cout != count_copy)% J! R$ t) ~" p# \
        {2 R! r) w$ Z9 ~$ u& U
                printf("a is %d\n", buf.a);
7 W- g, d6 Q$ G5 X' @- T& H                printf("b is %d\n", buf.b);
  Q- f; V4 @* W2 w$ E                printf("count is %d\n", buf.packet_cout);# L1 n: i' H5 [, D+ ]) l
                count_copy = buf.packet_cout;
1 Q1 h+ p. U  O        }$ m3 ]; z0 f" f
        else
1 }( j$ u8 [( b        {
% j7 [3 Y9 i# d! y5 N                printf("No effective message!");
  [. k/ q6 R8 O6 ^) \- j+ [% Q        }; L, x+ B, b) @( h' ?- i
}: Y% V5 J2 k" m9 Y1 }; R
  c2 ^( h" o; V9 c$ W
# R: x9 s9 `6 ^4 P
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ G& z* J+ ^# d1 f: [8 _; s
使用下面代码,对内存使用了mmap函数后:
0 u5 g4 t2 I# X4 i5 d3 N( Y& w7 W7 y$ e#include <stdio.h>. ^1 N$ \$ w7 f8 i" n$ Y( d0 A
#include <unistd.h>3 ~& U: V7 g2 U3 c" E) \9 h" d+ }
#include <sys/mman.h>5 s2 {+ c5 X  n3 z! V7 X9 L
#include <sys/types.h>
7 {" @9 X0 u) B, D6 P) l#include <fcntl.h>
/ W/ L. q; v$ e0 y+ E
# L: u8 J" J9 G* C( h' L#define SHAER_RAM_BASE_ADDR    (0x80000000)0 t* b: ?+ D" ^7 D* P
#define SHAER_RAM_SIZE         (0x20000)   
( W; F, ~7 o4 Y# M( M4 j9 Q$ q: u+ V$ M; \
typedef struct
" O- R! U' q9 B( {{" `, Y8 {6 ~; w! H4 F+ T
        unsigned int a;
4 I0 Q# O7 a  w9 ^9 y        unsigned int b;
! j+ X/ n* A% y2 [8 p% h        unsigned int packet_cout;7 {. T& J4 j6 ?% \4 }5 C. K% ~2 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 j' N; U  l9 c% K! p# d0 X5 x
% U/ w, W$ {! ?. K+ l; B7 h# Avoid read_MSG_buffer(int *baseaddr);
" I' H0 T! C" O: q6 ]unsigned int count_copy = 0;9 z! [3 t3 A/ S/ f! t0 U' W

: T% y% }& I$ `1 @1 W/ Kint main()) ]3 ?0 ]# V4 W) b& x4 w
{5 \$ t: K" n! {$ B+ h( ~& R
        int fd;
; p. @% P4 Q1 v8 D9 T: m; o# F        int *mem = NULL;4 l9 r( W, p" y: ]* o
- Y) H; Y5 W4 _/ a
        if((fd = open("/dev/mem", O_RDWR)) <0)7 C6 c& m: J0 M3 B' k% @* L- q2 A
        {  w) {" t4 q9 C' n* _- m* j: j
                perror("open error");
6 x# ?. V$ z: t9 u% I- X                return -1;  t. {% m8 r' v
        }
% }" g; i! M; D. I        
+ E# ~+ H7 v5 C        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ }; m& M4 S" {- l; o- }: ]. T; Y& k0 W
        while(1)
0 O; W) `2 x' q& `        {
: x! o6 T3 A4 @  W7 r& l8 W: v                read_MSG_buffer(mem);
& X8 _6 U% w0 ^; I        }               
& j7 z! {  X& A3 p" x! ~2 }" `}
6 {( }/ A) g6 u3 l( h4 v3 Z6 v. j( w# D! _0 Z% l. `7 d
void read_MSG_buffer(int *baseaddr)
- n# E) z2 H" s& ]/ s, n1 z{
- y6 z3 P  y' R        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ V! u, R3 R& `9 k
" Y  g( ^# e1 _8 Z0 Y  V        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) _, n5 ?1 n/ u6 _% y, r, S' J2 n- f

$ Q# m' d# t3 U% u( v! D" ~        if(pshreRAM->packet_cout != count_copy)' b1 T. D9 `, F: @+ R0 a- u
        {
* \! h4 Q& @; l                printf("a is %d\n", pshreRAM->a);
9 |# G' l7 F3 N, e2 d4 G0 ], U  q                printf("b is %d\n", pshreRAM->b);' W2 V  P' Y' ?" q4 Y
                printf("count is %d\n", pshreRAM->packet_cout);
+ \8 o# f$ N3 o1 i                count_copy = pshreRAM->packet_cout;
7 k/ }$ o- I3 D        }- N5 V: O. l! ~. A2 {
        else
# t( s/ u5 i+ B. r7 O        {
$ P  c) O4 \% S- ]                printf("No effective message!\n");
: Z0 y4 |4 n9 S6 v- j3 \6 L% _        }9 m4 H9 ]) m  K' t# g' j
}( O/ F; g, u8 O) `8 a
1 |! P& B$ \/ y# D+ b) Q
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  ^. k! j7 h: W, r( e
5 I0 k7 o5 N  {: q( n0 Y
9 w- L# a. r" I7 |7 ]) u* v) U
3 A% G  n1 Q  Y7 `% V6 v
4 }8 g  m! K6 W! H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-19 14:25 , Processed in 0.039055 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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