Linux 上下文切换分析笔记 (MIPS)

MIPS处理器下Linux调度器的调度时机 1. Linux的调度器,N多书有介绍,但是这些介绍基本都是给个大致概念,具体还要看代码。这部分的实现,不同的内核版本有一定的差异,我看的内核版本是2.6.21.7。2. 关于调度器,我的理解,无外乎3点:什么时候去检查是否需要调度(调度时机),如何选择应该运行的任务(调度策略),怎样做任务的切换。任务的切换,也就是上下文切换,相对简单。调度策略,Linux下有SCHED_RR, SCHED_FIFO,SCHED_OTHER, N多书上对他们差别的讲解足够,且易于理解。我主要学习了调度时机。3. 由于要进行 阅读详情

作者: comcat 发表日期: 2007-09-24 16:29          http://comcat.blog.openrays.org/blog.php?do=showone&tid=455

 

1. 内核栈切换 (MIPS)

调度切换至一个进程时,根据 task_struct->thread_info 的值设置 *kernelsp(当前正在运行进程之内核栈栈底),其值为 thread_info + THREAD_SIZE - 32(MIPS 下,使用 set_saved_sp 宏)。


2. 异常、中断寄存器的保存 (MIPS)

使用SAVE_SOME 保存上下文时,如发现从用户态切入核心态,则首先用 get_saved_sp 宏,将*kernelsp 置入sp。然后在内核栈上分配 PT_SIZE(=sizeof(struct pt_regs)) 大小的空间,作为上下文的保存空间。保存时所有数据精心组织,最后就是一个 struct pt_regs 结构。

若是用户态 --> 内核态,则 k0 = sp, sp = *kernelsp - PT_SIZE,store k0, PT_R29(sp),保存其它寄存器。

若是内核态 --> 内核态,直接 k0 = sp, sp = sp - PT_SIZE,store k0, PT_R29(sp),然后保存其它寄存器。


3. 任务切换上下文的保存 (MIPS)

时钟中断后使用 SAVE_SOME 在内核栈/用户栈(取决于当时所在模式)上保存 $0, $2, $3, $4~$7, $8~$9(64bit), $25, $28, $29, $31, STATUS, CAUSE, EPC。

后在 switch_to 中保存正在运行任务的上下文:

保存 STATUS,使用 cpu_save_nonscratch 保存$16~$23, $29(sp), $30,以及 $31, 有FPU还要 fpu_save_double 保存FPU的寄存器。所有都保存于thread_struct 结构中,该结构为 task_struct 的一部分。

这些保存的是 switch_to 前后的上下文


然后将将要运行的任务上下文加载:

$28 <---- &thread_info
cpu_restore_nonscratch 恢复 $16~$23, $29(sp), $30
*(kernelsp) <---- &thread_info + THREAD_SIZE - 32
恢复 thread_struct 中保存的 STATUS(bit 0, bit 8~15 用当前STATUS值替换)

现在恢复时也在 switch_to 前后,神不知鬼不觉的替换了,所有操作都是由switch_to调用叶函数resume完成。

do_IRQ 返回后,sp恢复(减多少,对称的加多少,因此与初值无关,最终指向新进程的 pt_regs 结构)ref_from_irq 则时钟中断返回(当时被中断时的环境),然后 eret 跳回到用户态(或者被时钟中断的核心态)继续运行。


4. switch_to 为何不需保存$0~$15 $24~$27 (MIPS)

假如内核要从进程A切换到进程B,流程大概是这样:

进程A --> 时钟中断 --> schedule --> switch_to(resume) --> schedule 返回 --> ret_from_irq --> 进程B

switch_to 保存于 A task_struct->thread_struct 中的状态是整个调用链中的 switch_to 宏附近的处理器状态

因此将 sp 指向保存于 B task_struct->thread_struct 中的 sp 时,实际上就相当于恢复到当时进程B在switch_to前后的状态:

进程B --> 时钟中断 --> schedule --> switch_to

switch_to 是一个宏,其中调用了,位于 arch/mips/kernel/r4k_switch.S 中的一个叶函数(不改变静态寄存器的值,不用压栈、出栈)resume,因此进入 resume 前,ABI 规定的一些非静态寄存器的值就再也不用了,故这些非静态值无需保存。

至于静态寄存器的值,函数用之前都会保存于栈上,最后恢复之,子函数调用不会改变其值。因此静态寄存器保存的是当时运行状态的一部分。如这种情况:

schedule 中编译器用 s0 保存一个重要的状态变量,因此进入schedule首先保存s0的值,使用 s0 参与运算,switch_to 后,又要根据 s0 判断进一步的动作。

这个时候就要将 s0 恢复为进程B当时在此点的值。总之注意,switch_to 后所有操作延续的是进程B的:

schedule 返回 --> ret_from_irq --> 进程B


5. 中断处理时可否睡眠问题

Linux 设计中,中断处理时不能睡眠,这个内核中有很多保护措施,一旦检测到内核会异常。

当一个进程A因为中断被打断时,中断处理程序会使用 A 的内核栈来保存上下文,因为是“抢”的 A 的CPU,而且用了 A 的内核栈,因此中断应该尽可能快的结束。如果 do_IRQ 时又被时钟中断打断,则继续在 A 的内核栈上保存中断上下文,如果发生调度,则 schedule 进 switch_to,又会在 A 的 task_struct->thread_struct 里保存此时时种中断的上下文。

假如其是在睡眠时被时钟中断打断,并 schedule 的话,假如选中了进程 A,并 switch_to 过去,时钟中断返回后则又是位于原中断睡眠时的状态,抛开其扰乱了与其无关的进程A的运行不说,这里的问题就是:该如何唤醒之呢??

另外,和该中断共享中断号的中断也会受到影响。
MIPS Linux内核编译构建环境的搭建 AI的端侧应用离不开各种算力平台,目前形成了CPU+NPU,CPU+FPGA以及CPU+GPU的几类算力搭配,他们各有优势,也各有弱点。先看它们的共同点,从组合名字可以看出,这些组合场景都需要CPU,这是因为NPU,FPGA和GPU的架构特点决定了它们在流水线pipeline,逻辑处理和控制方面要弱于CPU,所以通常作为专用算力加速器的协处理器。 阅读详情

相关推荐

探秘 Linux 内核:精准识别 ARM、MIPS 和 x86_64 架构的全攻略

CPU 架构是指计算机中央处理器的设计蓝图,它决定了指令集、寄存器布局等关键特性。对于 Linux 系统而言,不同的架构意味着底层硬件交互方式的不同,进而影响到操作系统的编译优化、驱动程序支持等方面。ARM:广泛应用于移动设备和平板电脑,因其低功耗设计而备受青睐。MIPS:常见于嵌入式系统中,具有高效能比的特点。:主流桌面和服务器平台的核心,提供卓越的性能和广泛的软件兼容性。通过本文的学习,相信您已经掌握了识别 Linux 系统架构的基本技巧。

携梦问道的博客 1581

2.6下用request_irq引起的问题

原文地址:http://blog.sina.com.cn/s/blog_637deacd0106dfmv.html 奇怪的是在2.6用request_irq时发现好几个问题 我引入的头文件如下: #include #include #include #include #include 1、不认识SA_INTERRUPT,会提示 implicite declartion

dragon_cdut的博客 1230

【Linux线程资源与线程切换介绍】

linux线程资源和线程切换介绍

ao_jiao_322的博客 1441

八、IDA动态调试MIPS-Linux程序

在使用IDA对MIPS-Linux程序做动态分析的时候,按照常规的逻辑,我们应该假设MIPS-Linux程序能够以一种等待调试的状态运行着,然后我们就可以使用IDA远程附加调试的方式attach到这个MIPS-Linux进程上,然后通过断点或单步的方式对进程进行动态调试。所以,“如何让路由器中的MIPS-Linux程序能够以一种等待调试的状态运行着”应该是首要解决的问题。然而实际情况却没那么乐观,...

wanhex的博客 2469

Linux-mips下使用ngrok穿透路由

Linux-mips下使用ngrok穿透路由 一、基础操作指导 1、基础准备工作 1. 下载安装VMware Player,准备虚拟机软件 2. 下载ZLWL_Compiler_xxx.zip,并解压到工作目录 3. 启动VMware Player, 并点击“打开虚拟机”添加ZLWL虚拟机系统 4. 启动ZLWL Compiler虚拟机 重要:由于各版本系统默认安装依赖库、头文件等的不同,请勿升级ubuntu版本。 2、编译环境准备 1、ZLWL虚拟机系统为原始安装系统,并未做过多定制。 超级

liumengxin666666的博客 574

Linux的中断处理分析

MIPS中,中断被当作一种异常(第0号异常)来处理。中断由外部设备产生,可能发生在任何时刻,每个中断都有一个编号分配给一个外部设备,这样来区分不同设备产生的中断,如果硬件和内核支持共享中断,则可以由多个设备共享一个中断编号。         在CPU得知中断发生后,它将进一步的处理委托给一个软件例程,这个软件例程是体系结构相关的,然后根据中断号来识别中断源,并进入特定的中断处理程序来处理该中断。

落尘纷扰的专栏 2511

关于Linux上下文切换

关于Linux上下文切换 1. 内核栈切换 (MIPS) 调度切换至一个进程时,根据 task_struct->thread_info 的值设置 *kernelsp(当前正在运行进程之内核栈栈底),其值为 thread_info + THREAD_SIZE - 32(MIPS 下,使用 set_saved_sp 宏)。 2. 异常、中断寄存器的保存 (MIPS) 使用SAVE_SOME

Rain的专栏 1767

RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析)

本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。

weixin_29184371的博客 492

进程切换源码分析

linux源码版本为linux-3.10.84,分析mips的进程切换。从进程A切换到进程B。   在进程切换主要实现在kernel/sched/core.c中。   进程调度入口函数为asmlinkage void __sched schedule(void)函数。这一函数第二句语句通过sched_submit_work(tsk);这一语句来避免死锁产生,然后调用__schedule()函数

sd10086的博客 845

CoaXPress FMC子卡:高速图像采集与FPGA原型开发实战指南

在机器视觉和工业检测领域,高速、可靠的数据传输是核心需求。CoaXPress(CXP)协议作为一种基于同轴电缆的高速接口标准,通过其高带宽、长距离传输和低延迟的特性,有效解决了传统接口在确定性实时传输方面的短板。其技术价值在于为海量图像数据提供了稳定、高效的物理层和数据链路层解决方案,广泛应用于半导体检测、医疗成像等对吞吐量有极致要求的场景。要实现CXP系统的快速原型验证,集成了高速SerDes接口和时钟管理的FMC子卡与FPGA开发板的组合成为关键。这种平台将复杂的硬件设计封装,让开发者能聚焦于图像处理算

weixin_31815843的博客 278

MATLAB实战:用Costas环和Gardner环搞定QPSK同步问题(附完整代码)

本文详细介绍了如何使用MATLAB实现Costas环和Gardner环联合解决QPSK同步问题,包括载波同步和定时同步的技术原理、MATLAB代码实现及性能分析。通过完整的仿真示例和工程实践建议,帮助读者掌握QPSK同步技术的核心要点,提升数字通信系统的解调性能。

agile9scrum的博客 691

linux mips汇编指令集,mips汇编指令集功能的介绍

描述简单来说,指令集就是CPU能看得懂的语音,可以称之为机器语言。CPU指令集主要包括CISC(复杂指令集)和RISC(精简指令集)。形象点说,CISC类似于汉语,每一句话都是由汉字组成,而每一个汉字就相当于一条指令集;RISC类似于英语,每一句话都是由字母组成,而每一个字母就相当于一条指令集;(这里不讨论什么汉字是笔画组成的,形象的比喻而已)但是无论汉语和英语,都能实现人类基本交流。例如:英语虽...

weixin_42302384的博客 1263

Dify社区版多工作空间功能解锁:源码修改与多租户架构解析

多租户架构是现代SaaS平台实现数据隔离与资源管理的核心技术,其核心原理是通过租户模型将用户、应用和数据在逻辑上隔离。在AI应用开发平台中,这种架构能有效支持多团队、多项目并行开发,确保不同业务线的数据安全与独立迭代。Dify作为开源AI应用构建平台,其底层已设计完善的多租户模型,但社区版默认限制了单用户单工作空间。本文通过精准修改两处关键代码——账户初始化逻辑与系统功能开关,释放了平台固有的多工作空间管理能力。该方案无需改动数据库结构,直接利用现有RBAC权限体系,实现了类似企业版的**多租户隔离**体验

weixin_27059669的博客 1059

linux下调试切换到某一帧,【Linux】Linux下MIPS平台交叉编译FFmpeg库 及使用库截取视频中的某一帧...

一.Linux下MIPS平台交叉编译FFmpeg库: 1.下载ffmpeg库的源代码( http://sourceforge.net/project/showfiles.php?group_id=205275&package_id=248632):[root@localhost ffmpeg]# lsffmpeg-laster.tar.gz2.解压:[root@localhost ffmp...

weixin_36476695的博客 215

工业级24V电源保护电路深度解析:五重防护机制详解

自恢复保险丝(PPTC,Positive Temperature Coefficient)是一种过流保护元件✅可恢复:过流后自动恢复,无需更换⚡响应快:电流超标立即动作🔄多次使用:在额定范围内可反复使用第1层(F1):阻挡过流 → 物理熔断第2层(D3):吸收浪涌 → 能量泄放第3层(Q1):防止反接 → 逻辑阻断第4层(Q2/Q3):抵御过压 → 主动切断第5层(CR):平滑启动 → 时序控制设计哲学:"让每一级保护专注做好一件事"通过这篇文章,我们深入理解了:✅自恢复保险丝。

qq_58068673的博客 3570

解释多智能体强化学习(Multi-Agent Reinforcement Learning)(面试题200合集,中频、重要)

多智能体强化学习通过扩展传统强化学习框架,研究多个智能体在动态、交互环境中的策略优化问题。它既有理论上的挑战(如非平稳性和均衡求解),也有广泛的实际应用前景。数学上,它依赖马尔可夫博弈模型,核心是设计算法让智能体在合作或竞争中达到最优。

qq_38334677的博客 990

MIPS体系结构剖析,编程与实践 [7]

http://blogold.chinaunix.net/u1/40363/showart_434193.html第七章 MIPS-Linux Kernel 分析(3)<br />下面是我在为godson CPU的页面可执行保护功能增加内核支持时分析linux-mipsmmu实现的一些笔记,没有时间整理,有兴趣就看看吧.也许第5节对整个工作过程的分析会有些用,其它语焉不详的东西多数只是对我本人有点用.   首先的,关键的,要明白MIPS CPU的tlb是软件管理的,cache也不是透明的,具体的   参见它

ivan240的专栏 1610

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现

Linux 的 Spinlock 在 MIPS 多核处理器中的设计与实现文档选项<br />将此页作为电子邮件发送<br /><br />级别: 初级<br />赵 昊翔 (haoxiang@hotmail.com), 工程师<br />2008 年 8 月 04 日Spinlock 在 Linux 中被广泛应用于解决多核处理器之间访问共享资源的互斥问题,本文以 MIPS 多核处理器为例,介绍了 Spinlock 的设计与实现,以及 Spinlock 的不足与扩展。<br />引言<br />随着科技的发展

babyfans的专栏 934

GD32F103 -- LIN从机通讯 -- 程序代码 (精简版)

注意!!!注意!!!这是GD32从机通讯!!!GD32!!!GD32!!!

晴朗luo的博客 2499

深度学习工具包 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")

关于MIPS平台的asid_cache debug的总结

最近遇到一个非常有意思的问题,MIPS平台的CPUHOTPLUG会有一定的概率导致应用程序出现段错误,花了几天的时间排除了一大堆问题后,最后定位到了MIPS公司的一段代码上,竟然是在trap_init里又对asid_cache进行了初始化! 在网上很少有关于asid的内容,有也讲的不详不尽,今天写完了文档,决定把它贴出来!欢迎一起讨论。    ====================

Am_111的专栏 2995

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mips 异常处理和进程切换

原文网址: http://blog.chinaunix.net/uid-26817832-id-3146430.html 一. 内核栈 每个进程拥有一个内核栈,调度切换至一个新进程时,会根据task_struct->stack(struct thread_info 结构体类型) 的值设置 *kernelsp(当前正在运行进程之内核栈栈顶),将kernelsp的值设置为

junmuzi的专栏 1425

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

告别printf调试!用perf分析嵌入式程序性能的完整指南(MIPS平台实测)

本文提供了一份在MIPS架构嵌入式设备上部署和使用Linux性能分析工具perf的完整实战指南。通过详细的内核配置、交叉编译步骤,指导开发者告别低效的printf调试,利用perf以极低开销进行系统级性能剖析,精准定位程序热点与瓶颈。

weixin_29173777的博客 422
上一篇: 龙芯版 memcpy 的实现
下一篇: MIPS 下非对齐访问的问题
LonlyGod
博客等级 码龄15年 32粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值