eCos FrameBuffer driver

Linux Framebuffer驱动剖析之二—驱动框架、接口实现和使用 本文继上一篇文章《Linux Framebuffer驱动剖析之一—软件需求》,深入分析LinuxFramebuffer子系统的驱动框架、接口实现和使用。 阅读详情

一、eCosFrame buffer API的作用和存在的意义

大家都知道在一些大型的操作系统上都有Framebuffer的概念,比如Linux,Windows等。

Framebuffer驱动程序是显示设备的一个抽象层,它使得图形系统和其他应用显示设备的程序与具体显示设备独立开来,增加了系统的可移植性。

在eCos中CYGPKG_IO_FRAMEBUF包提供了Framebuffer驱动的抽象层,它可以被应用程序或者其他包来使用。(本文原创转载请注明出处)

 

二、如何编写线性标准的Frame Buffer驱动

在eCos提供的IO层驱动函数中包含了线性framebuffer的操作函数,所谓线性framebuffer就是在LCD初始化以后分配一段固定的内存空间,我们对这段内存空间的读写直接相当于操作屏幕。

以MINI2440的QEMU平台为例,我们首先初始化好LCD,并且分配好一个事先准备的内存空间给Framebuffer,然后把一些基本的画点和画线函数用IO层的线性函数替代就基本完成了Framebuffer驱动。

先来看一下MINI2440 Framebuffer需要实现的结构体

红色 表示调用IO层次的内置函数

绿色 表示需要自己实现的LCD初始化函数

蓝色 表示需要的一些配置和LCD Framebuffer地址等

CYG_FB_FRAMEBUFFER(CYG_FB_fb0_STRUCT,
                   CYG_FB_fb0_DEPTH,
                   CYG_FB_fb0_FORMAT,
                   CYG_FB_fb0_WIDTH,
                   CYG_FB_fb0_HEIGHT,
                   CYG_FB_fb0_WIDTH,
                   CYG_FB_fb0_HEIGHT,
                   CYG_FB_fb0_BASE,
                   CYG_FB_fb0_STRIDE,
                   CYG_FB_fb0_FLAGS0,
                   CYG_FB_fb0_FLAGS1,
                   CYG_FB_fb0_FLAGS2,
                   CYG_FB_fb0_FLAGS3,
                   (CYG_ADDRWORD) &cyg_mini2440_fb0_lcd,
                   (CYG_ADDRWORD) 1,
                   (CYG_ADDRWORD) &fb0_mini2440,
                   (CYG_ADDRWORD) CYGMEM_REGION_lcd,
                   &mini2440_fb_on,
                   &mini2440_fb_off,
                   &mini2440_fb_ioctl,
                   &mini2440_fb_synch,
                   &cyg_fb_nop_read_palette,
                   &cyg_fb_nop_write_palette,
                   &cyg_fb_dev_make_colour_16bpp_true_565,
                   &cyg_fb_dev_break_colour_16bpp_true_565,
                   &cyg_fb_linear_write_pixel_16,
                   &cyg_fb_linear_read_pixel_16,
                   &cyg_fb_linear_write_hline_16,
                   &cyg_fb_linear_write_vline_16,
                   &cyg_fb_linear_fill_block_16,
                   &cyg_fb_linear_write_block_16,
                   &cyg_fb_linear_read_block_16,
                   &cyg_fb_linear_move_block_16,
                   0, 0, 0, 0
                   );

再看一下CYGMEM_REGION_lcd

个人认为向Framebuffer这样的设备驱动,应该在系统编译的时候直接指定一段内存,而不是定义一个大数组让编译器决定放到一个什么位置。

所以,我在memory配置文件中定义一个区域CYGMEM_REGION_lcd,把这个区域放在ram的最高地址处作为framebuffer需要的内存地址。

 

// eCos memory layout - Fri Oct 20 05:43:59 2000

// This is a generated file - do not edit

#ifndef __ASSEMBLER__
#include <cyg/infra/cyg_type.h>
#include <stddef.h>

#endif
#define CYGMEM_REGION_ram (0)
#define CYGMEM_REGION_ram_SIZE (0x3600000)
#define CYGMEM_REGION_ram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
#define CYGMEM_REGION_lcd (0x3600000)
#define CYGMEM_REGION_lcd_SIZE (0xa0000)
#define CYGMEM_REGION_lcd_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
#define CYGMEM_REGION_sram (0x40000000)
#define CYGMEM_REGION_sram_SIZE (0x1000)
#define CYGMEM_REGION_sram_ATTR (CYGMEM_REGION_ATTR_R | CYGMEM_REGION_ATTR_W)
#ifndef __ASSEMBLER__
extern char CYG_LABEL_NAME (__heap1) [];
#endif
#define CYGMEM_SECTION_heap1 (CYG_LABEL_NAME (__heap1))
#define CYGMEM_SECTION_heap1_SIZE (0x3600000 - (size_t) CYG_LABEL_NAME (__heap1))


LCD的初始化代码参考emboslab的

packages\devs\framebuf\arm\mini2440\current\src\mini2440fb.c

 

下面在讨论一下framebuffer驱动是如何初始化的

参考一下

packages\devs\framebuf\arm\mini2440\current\src\mini2440fb_init.cxx

eCos的framebuffer io层会通过一种宏代码调用含有framebuffer名字的c++初始化函数,比如我们的framebuffer名字是mini2440

那么系统最终会调用cyg_mini2440_fb_init这个函数,而cyg_mini2440_fb0_instantiate真是我们实现LCD初始化的入口。

 

#include <pkgconf/devs_framebuf_mini2440.h>
#include <cyg/io/framebuf.h>

class cyg_mini2440_fb_init {

public:
    cyg_mini2440_fb_init(void)
    {
#ifdef CYGPKG_DEVS_FRAMEBUF_MINI2440_FB0
        cyg_mini2440_fb0_instantiate(&CYG_FB_fb0_STRUCT);
#endif
    }
};

static cyg_mini2440_fb_init cyg_mini2440_fb_init_object CYGBLD_ATTRIB_INIT_PRI(CYG_INIT_DEV_CHAR);


在看一下eCos的Framebuffer是如何实现平台无关性的

首先eCos的Framebuffer是一个API层次,并非是设备文件,因此实现平台无关性采用了一个特殊的技巧。

先看一下结果,然后我们再看如何实现

ecos_install\include\cyg\io\framebufs\framebufs.h

#ifndef CYGONCE_IO_FRAMEBUFS_FRAMEBUFS_H
# define CYGONCE_IO_FRAMEBUFS_FRAMEBUFS_H

/* This is a generated file - do not edit! 			*/
/* <cyg/io/framebufs/framebufs.h> should not be #include'd 	*/
/* directly, instead use <cyg/io/framebuf.h>			*/
#include <cyg/io/framebufs/mini2440_fb.h>
#define CYGDAT_IO_FRAMEBUF_DEFAULT_TEST_DEVICE fb0
#endif

以上这个文件是编译好的eCos生成的一个framebufs.h的头文件,我们看到这是一个自动生成的文件。

在这个文件中自动的加入了

#include <cyg/io/framebufs/mini2440_fb.h>

而这个头函数,正式我们对MINI2440的framebuffer的一些特殊设定,也有一些特别的函数。

当用户去应用framebuffer时,因为eCos已经把需要的头函数加到了一个共有头函数中,所以我们可以看作应用层无需再考虑目前

是在什么样的显示设备上。

 

那么这个头文件是怎么样自动加入进来的呢

首先我们需要写一个tcl脚本,这个脚本是从framebuffer的synth平台复制过来的。

packages\devs\framebuf\arm\mini2440\current\src\gen_mini2440fb.tcl

简单看几行, set_fb会根据framebufer的配置而更改,比如我们设置famebufer ID是0

那么

#define CYG_FB_fb[set fb]_STRUCT            cyg_mini2440_fb[set fb]

就会展开成

#define CYG_FB_fb0_STRUCT            cyg_mini2440_fb0

extern cyg_fb cyg_mini2440_fb[set fb];
#include CYGHWR_MEMORY_LAYOUT_H
#define cyg_mini2440_fb0_base  ((volatile cyg_uint8*)CYGMEM_REGION_lcd)
externC void cyg_mini2440_fb0_instantiate(struct cyg_fb *fb);
externC struct cyg_fb CYG_FB_fb0_STRUCT;
#define CYG_FB_fb[set fb]_STRUCT            cyg_mini2440_fb[set fb]
#define CYG_FB_fb[set fb]_DEPTH             $depth
#define CYG_FB_fb[set fb]_FORMAT            $format
#define CYG_FB_fb[set fb]_WIDTH             $width
#define CYG_FB_fb[set fb]_HEIGHT            $height
#define CYG_FB_fb[set fb]_VIEWPORT_WIDTH    $viewport_width
#define CYG_FB_fb[set fb]_VIEWPORT_HEIGHT   $viewport_height
#define CYG_FB_fb[set fb]_BASE              cyg_mini2440_fb[set fb]_base
#define CYG_FB_fb[set fb]_STRIDE            $stride
#define CYG_FB_fb[set fb]_FLAGS0            $flags0
#define CYG_FB_fb[set fb]_FLAGS1            0
#define CYG_FB_fb[set fb]_FLAGS2            0
#define CYG_FB_fb[set fb]_FLAGS3            0


只有脚本是不够的,我们还需要在framebuffer驱动的cdl配置文件中去运行这个脚本

cdl_package CYGPKG_DEVS_FRAMEBUF_MINI2440 {
    display		"MINI2440 board Framebuffer device driver"
    parent		CYGPKG_IO_FRAMEBUF
    active_if		CYGPKG_IO_FRAMEBUF
    hardware
    include_dir		cyg/framebuf
    compile			mini2440fb.c
    compile			-library=libextras.a mini2440fb_init.cxx

    make -priority=1 {
        <PREFIX>/include/cyg/io/framebufs/mini2440_fb.h :      \
            <PACKAGE>/src/gen_mini2440fb.tcl                   \
        <PREFIX>/include/pkgconf/devs_framebuf_mini2440.h
        tclsh {1}lt; $(PREFIX)
    }


三、完成emboslab的framebuffer的测试

有了以上的基础就会很容易的写一个eCos的Framebuffer驱动。

编译eCos的测试程序

Build->Tests

 

qemu-system-arm.exe -M mini2440 -kernel ecos_install\tests\io\framebuf\current\tests\fb -show-cursor -serial file:CON

qemu-system-arm.exe -M mini2440 -kernel ecos_install\tests\io\framebuf\current\tests\fbmacro -show-cursor -serial file:CON

 

四、应用eCos Framebuffer 驱动

有了这样一个Framebuffer接口就很容易移植不同的GUI在eCos上,经过评估选择一款合适于你产品的GUI。

 

多节阶梯阻抗变换器工程设计的公式推导   多节阶梯阻抗变换器工程设计的公式推导,仔细看此文,有点烧脑,所以碎片十分钟,收获一丢丢。   现在就来设计一个超宽带多节阶梯阻抗变换器,要求带内纹波符合切比雪夫分布。   其实,此文已经是省去了大量中间公式推导,只剩下精炼内容了。   阶梯阻抗变换器指标需求   假设现在有一项目需求分析结果是:做一个微带线超宽带阶梯阻抗变换器,指标如下:   从50欧变换到100欧;   回波损耗22dB;   功率容量:2W;   频率范围2~18GHz;   插损能做多少就多少,用30mil板厚. 阅读详情

相关推荐

Logisim实战:手把手教你搭建GB2312汉字字库(附完整电路图)

本文提供了一份详尽的Logisim实战指南,手把手教你如何利用存储芯片,通过位扩展和字扩展技术,构建一个完整的GB2312汉字字库。文章深入浅出地讲解了从编码原理、系统架构设计到具体电路实现与调试的全过程,是学习计算机组成原理和数字电路设计的绝佳实践项目。

k6l7m8n9的博客 808

虚拟嵌入式系统实验室

1. 嵌入式实验室的创建   本人是一个嵌入式系统的爱好者,移植和应用过多种嵌入式系统。工作以来主要从事WinCE,Linux和Android的开发。   一直有一个梦想,希望像我一样的嵌入式系统爱好和工作者,能够在没有硬件的条件下去了解和开发这样的系统。 现在,自由

嵌入式虚拟系统实验室 9644

AISHELL-2 中文语音数据库

AISHELL-1 is by far the largest open-source speech corpus available for Mandarin speech recognition research. It was released with a baseline system containing solid training and testing pipelines for Mandarin ASR. In AISHELL-2, 1000 hours of cle

AI_SHELL的博客 7887

linux驱动面试题2018(面试题整理,含答案)

linux驱动面试题2018(面试题整理,含答案) 前言: 这篇文章主要是对linux驱动面试题一个整理跟总结,参考了很多网上的资料,基本涵盖linux驱动相关面试内容。我把他们大概的分为三部分:基础部分,同步相关,还有中断部分。中断,同步相关基本都是必问的。下面也会对这几个方面的面试题进行详细的解答,你把下面的面试题弄懂了,应该可以应付大部分linux驱动面试了。要想真正的理解,还的在实践中...

qq_38035496的博客 3308

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

XTDrone——ALOAM与3D激光雷达三维SLAM(处理没有点云和坐标系报错的问题)

本文介绍了XTDrone中配置如何在三维环境中使用A-LOAM算法配合velodyneHDL32激光雷达包括依赖包安装、代码修改和PX4系统配置,以及相关报错细节的注意事项。

weixin_45390670的博客 1326

Framebuffer Driver

<br /> 中文名为:帧缓冲驱动  一、FrameBuffer的原理  FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。  Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映

兰尘墨世 575

使用 syncstart 实现同场景下多个音视频音轨自动化同步

如果需要在视频编辑中同步多个机位的音轨,使得相同的视频能够同时播放,手动操作可能会变得相当复杂。特别是当处理多个视频文件时,例如有10个视频需要互相匹配,实现一对多的同步关系,这就涉及到为每对视频生成匹配的音轨数据。手动完成这样的任务,如生成90套对应的音轨数据,不仅耗时而且容易出错。因此,使用脚本自动化这一过程是一个更为高效和准确的解决方案。通过编写脚本,您可以批量处理多个视频文件,自动同步它们的音轨,大大简化了音视频编辑的工作流程,并确保了同步的准确性。

Mr数据杨 1076

路由器基础知识详解

第一章  网络互联           网络的根本目的非常简单:方便人们交换所获得的信息。但是网络的应用需求非常复杂:有的用户希望高带宽,但并不要求很长的传输距离;有的用户要求很长的距离,但对带宽要求很低;有的对网络的可靠性要求较高,而另外一些则要求较低,等等。这些都导致了网络的多样化,现在比较常见的局域网有以太网、令牌环和FDDI,广域网有DDN、X.25、帧中继、ATM等,这些网络分别从不同

知秋一叶 4万+

2026年CSP-J初赛真题及答案解析

2026年CSP-J初赛真题及题解

王老师青少年编程 1616

网络变更:APIC 节点替换

Fabric Name,Controller ID,TEP Address Pool 等信息必须相同;如果故障设备是 APIC1 还需要重新配置管理密码。此过程可能需要 10 分钟左右,在此期间目标 APIC 可能在 Available/Unavailable 状态翻滚。APIC 获取 TEP 地址后,进入 fully-fit。通过 CLI 以及配置的密码登录目标 APIC。

m0_54931486的博客 318

eCos驱动程序设计

设备驱动程序主要用于对设备数据的读写操作,以及对设备配置和读取设备信息的操作,它还可以使用和管理来自设备的中断。所有的设备驱动程序设计接口都具有普遍性质。    设备驱动程序一般可分为三个部分:DEVTAB_ENTRY,设备IO函数表DEVIO_TAB、设备IO函数。     eCos中所有设备驱动都使用设备表入口来进行描述,设备表入口是一个具有cyg_devt

嵌入式OS研究小组 1165

人形机器人硬件电路设计入门

人形机器人属于。

blotemj.blog.youkuaiyun.com 229

Linux FB 驱动讲解

本文分析了frame buffer 设备驱动的主要数据结构: 基本原理 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来; 驱动程序分配系统内存作为显存;实现 file_operations 结构中的接口,为应用程序服务;实现 fb_ops 结构中的接口,控制和操

harvey2008的专栏 2357

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

linux framebuffer设备驱动,图像获取

在linux系统中,没有lcd驱动这种叫法,只有framebuffer设备驱动,也就是显存驱动,所以你是在内核驱动代码当中找不到直接lcd命名的文件夹。 这种驱动是用于实现提供应用程序的窗口图像的显示接口,如QT窗口程序的显示等。那下面实现这个显示接口,需要初始化下面的结构体,与linux的系统编程比较相似:struct fb_info 的一个对象表示一个framebuffer设备 struct ...

lailaiquququ11的博客 2140

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux帧缓冲(framebuffer)驱动

linux帧缓冲(framebuffer)驱动 一、FrameBuffer的原理 FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。           Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuff

luomiohong的专栏 1250

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux驱动开发 (framebuffer驱动)

1.什么是framebuffer frambuffer就是linux内核驱动申请的一片内存空间,cpu内部有个lcd控制器,它有个单独的dma用来将frambuffer中的数据拷贝到lcd的sram中去 拷贝到lcd的sram中的数据就会显示在lcd上,LCD驱动和framebuffer驱动没有必然的联系。 framebuffer帧缓冲(简称fb)是linux内核中虚拟出的一个设备。 framebuffer向应用层提供一个统一标准接口的显示设备。 从驱动来看,fb是一个典型的字符设备,而且创建了一个

weixin_49303682的博客 3566

基于FrameBuffer的直接写[转]

1.将FrameBuffer配置成800x600x16色的显示模式在/boot/grub/menu.lst中的kernel加入vga=0x314//test.c#include #include #include #includ...

ckpx42539的博客 270

flnx 在 mini2440 qemu ecos的nano-x上运行起来了

fltk是一个轻量级的gui,他可以跑在多种窗体管理架构中。 其中flnx就是fltk跑在nano-x上的一个特殊版本, 既然如此,我们就做一次flnx在ecos上的移植,解决ecos的gui问题

嵌入式虚拟系统实验室 1万+

ecos 自带的Microwindows中加入mwin的支持

如何让ecos的Microwindows支持WINAPI和自己内置的一些MWidget呢。 本文粗略的讲述了一下,源码会上传到emboslab

嵌入式虚拟系统实验室 8725

cygwin和mingw gdb串口连接的区别

最近一段时间在windows上用到了MinGW和Cygwin。 可能有些人比较奇怪为什么会有两个unix的模拟环境。(本文原创转载请注明出处http://blog.csdn.net/rickleaf) 因为RTEMS的官方toolchain工具是MinGW,所以RTEMS用MinGW 而eCos用的是Cygwin所以又安装了Cygwin。 因为安装MinGW在先,所以在GDB连接串口的gd

嵌入式虚拟系统实验室 5479

关于STM32 FLASH上运行ecos的内存配置的一点解释

最近很多网友问了关于STM32上运行ecos失败的一些问题,这里简要回答。 1、选择运行方式 cortexm3的ecos,有三种运行方式ram, rom和jtag ram和jtag是用于调试的,ram方式会把你的执行代码也放到ram中,jtag的代码放在rom中,这个内存模板主要是为了解决jtag连接不上的问题。 rom运行就是我们最后完成项目时候烧入到norflash中运行的方式,代码需

嵌入式虚拟系统实验室 5454

STM32 eCos 启动代码分析(三)系统时钟滴答

时钟滴答好比人的心脏一样,是操作系统必不可少的一个部件,在线程的切换和软件延时等系统时间相关功能中起着无法替代的角色。 操作系统中的时钟滴答,需要一个周期性的可配置的信号源来实现,并且一般都是以中断的方式在后台通知系统下一个滴答的到来。 (本文原创,转载请注明出处http://blog.csdn.net/rickleaf) eCos中为了提供移植性,一般会用CYGNUM_HAL_INTERR

嵌入式虚拟系统实验室 5340

STM32 eCos 启动代码分析(二)上下文切换

最近一直忙于工作,现在空一点继续写这个议题。(本文原创转载请注明出处 http://blog.csdn.net/rickleaf) stm32既然属于cortexm3体系结构,那么它的线程上下文切换必然要采用cortexm3的方式 打开 packages\hal\cortexm\arch\current\src\context.S //===========================

嵌入式虚拟系统实验室 4899

如何编译第一个eCos应用程序

这是一个给eCos初学者的简单说明,放在这里方便大家在下载和编译好eCos的库文件以后知道如何开始自己的eCos之旅。 (本文原创转载请注明出处) 环境配置 指定eCos repository和所需编译器的路径(其实这个也是要编译eCos库文件必须做的一个步骤) PA

嵌入式虚拟系统实验室 4337

eCos 3.0 版本和cvs版本的 arm-eabi toolchains的编译方法

最近因为要整理eCos的编译系统,为了具体的项目做准备,稍微了解了ecos toolchain的特殊性。 (本文原创转载请注明出处) 在网络上搜索了很多相关的内容,最后发现说的都不太准确,而且按照错误的方法编译出来的编译器可能本来就是不对的。 最要命的是,可能基本功能还

嵌入式虚拟系统实验室 3919
上一篇: STM32 eCos 启动代码分析(一)系统复位
下一篇: 如何编译第一个eCos应用程序
知秋一叶
博客等级 码龄19年 196粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值