【FreeRtos教程六】STM32 CubeMx——Mutexes And Recursive Mutexes(互斥量与递归互斥量)

嵌入式系统FreeRTOS — 互斥信号量 互斥信号量可以在资源保护的时候很有帮助。用于控制在两个或多个任务间访问共享资源。任务1里面用互斥,那么任务2只能等任务1访问完再访问同一个变量。 比如全局变量double gADC_value[CH_ADC_NUM] = {0}; //7 adc channals 任务1中:周期100ms的采样任务,并保存数据都全局数组中。 osMutexWait(myMut... 阅读详情
AI摘要

文章介绍了互斥量在多任务系统中的作用,防止资源竞争问题,通过一个按键任务和两个打印任务的示例展示了FreeRTOS中互斥量如何解决优先级反转。在示例中,按键任务控制打印任务的执行,分析了启用和禁用osMutexWait和osMutexRelease对任务执行顺序的影响,强调了互斥量在优先级继承中的重要性。

目录

1 互斥量

2 示例程序

2.1例程功能

2.2步骤

2.3实验结果

2.4函数讲解

2.5程序源码


1 互斥量

1.都是为什么要有互斥量

在多任务系统中,任务A正在使用某个资源,还没用完的情况下任务B也来使用的话,就可能导致问题。 比如对于串口,任务A正使用它来打印,在打印过程中任务B也来打印,客户看到的结果就是A、B的信 息混杂在一起。

所以我们希望某一任务在在某一时刻单独占有某一硬件资源,这时候便引入了互斥量。例如,我们怎么独享厕所呢?我们可以上厕所然后把门锁了,完事了自己开锁。使用队列、信号量都可以实现互斥访问,以信号量为例:

  • 信号量初始值为1
  • 任务A想上厕所,"take"信号量成功,它进入厕所
  • 任务B也想上厕所,"take"信号量不成功,等待
  • 任务A用完厕所,"give"信号量;轮到任务B使用

2.既然队列、信号量都可以实现互斥访问,为什么还要引入互斥量

假设任务A、B都想使用串口,A优先级比较低:

  • 任务A获得了串口的信号量
  • 任务B也想使用串口,它将会阻塞、等待A释放信号量
  • 高优先级的任务,被低优先级的任务延迟,这被称为"优先级反转"(priority inversion)

互斥量可以通过"优先级继承",可以很大程度解决"优先级反转"的问题,这也是FreeRTOS中互斥量和二 进制信号量的差别。这点在下面的例程中会被介绍。

3.FreeRtos的互斥锁是代码上约定的习惯

使用互斥量的核心在于:谁上锁,就只能由谁开锁。但是FreeRTOS的互斥锁,并没有在代码上实现这点,即使任务A获得了互斥锁,任务B竟然也可以释放互斥锁。所以为了实现互斥锁,就约定程序员在写代码的时候,那个任务上锁,就由那个任务解锁。

4.递归互斥量

互斥量能被多次获取,同时也要被多次释放。其功能就不在详细介绍。

2 示例程序

2.1 例程功能

按优先级由高到底分别创建一个按键任务(priority:High)、打印任务1(priority:Normal)、打印任务2(priority:Low),打印任务1和2先挂起,由按键任务来解挂起,观察打印任务2在添加获取互斥量程序前后,打印任务1和2执行的先后顺序。

2.2 步骤

配置按键IO口

 配置三个动态任务,优先级依次为High、Normal、Low

 配置一个互斥量

按键按下,唤醒打印任务1和打印任务2,并获取释放互斥量

/* USER CODE END Header_StartTask_KEY0 */
void StartTask_KEY0(void const * argument)
{
  /* USER CODE BEGIN StartTask_KEY0 */
  /* Infinite loop */
  for(;;)
  {
    if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0)
    {
        osDelay(10);
        if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0)
        {
            osThreadSuspendAll();
            printf("\nKEY_0按下\n");
            osThreadResumeAll();
            osThreadResume(myTask01Handle);
            osThreadResume(myTask02Handle);
            osMutexWait(myMutex01Handle,osWaitForever);//获得互斥量
            osMutexRelease(myMutex01Handle);//释放互斥量
            while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0)
            {
                osDelay(10);
            }
        }
    }
    osDelay(1);
 }

循环开始时任务挂起,等待按键按下后任务解挂起并打印字符串

void StartTask01(void const * argument)
{
  /* USER CODE BEGIN StartTask01 */
  /* Infinite loop */
  for(;;)
  {
      osThreadSuspend(NULL);
      osThreadSuspendAll();
      printf("嗨,我是打印任务 1\n");
      osThreadResumeAll();
      osDelay(1);
  }
  /* USER CODE END StartTask01 */
}

循环开始时任务挂起,等待按键按下后任务解挂起并打印字符串。程序osMutexWait()和osMutexRelease()屏蔽与不屏蔽,程序执行的结果有所不同。

/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
      //osMutexWait(myMutex01Handle,osWaitForever);//获得互斥量
      osThreadSuspend(NULL);
      osThreadSuspendAll();
      printf("嗨,我是打印任务 2\n");
      osThreadResumeAll();
      //osMutexRelease(myMutex01Handle);//释放互斥量
      osDelay(1);
  }
  /* USER CODE END StartTask02 */
}

2.3 实验结果

程序osMutexWait()和osMutexRelease()屏蔽时,当按键按下后,打印任务1和打印任务2按照优先级顺序先后执行

程序osMutexWait()和osMutexRelease()不屏蔽时,当按键按下后,打印任务2发生优先级继承先打印

实验评析

FreeRtos实现互斥的核心概念是:谁上锁,就由谁来解锁,那为什么不用信号量来实现一定要用互斥量来实现呢?关键在于使用信号量实现互斥会发生优先级的反转,而使用互斥量能通过优先级继承的方式来解决优先级反转的问题。(详情见韦东山的讲解)

板子上电,程序初步运行时,打印任务2获取互斥量后然后挂起,当按键按下,按键任务在解挂打印任务1、2后也想获取互斥量,但此时互斥量被打印任务2占有,这时候FreeRtos就会将打印任务2的优先级提升到和按键任务一样高(Priority:High),使互斥量被尽快释放。

2.4 函数讲解

1 osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec)

/**
@brief Wait until a Mutex becomes available
@param mutex_id      mutex ID obtained by \ref osMutexCreate.
@param millisec      timeout value or 0 in case of no time-out.
@retval  status code that indicates the execution status of the function.
@note   MUST REMAIN UNCHANGED: \b osMutexWait shall be consistent in every CMSIS-RTOS.
*/
osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec)
  • 函数功能:获取某一互斥量
  • 传入参数:1.mutex_id (要获取互斥量量的句柄) 2.millisec(超时等待时间)

2 osStatus osMutexRelease (osMutexId mutex_id)

/**
@brief Release a Mutex that was obtained by \ref osMutexWait
@param mutex_id      mutex ID obtained by \ref osMutexCreate.
@retval  status code that indicates the execution status of the function.
@note   MUST REMAIN UNCHANGED: \b osMutexRelease shall be consistent in every CMSIS-RTOS.
*/
osStatus osMutexRelease (osMutexId mutex_id)
  • 函数功能:释放某一互斥量
  • 传入参数:mutex_id (要释放互斥量量的句柄)

2.5 程序源码

github链接:HaoJosephWen/FreeRtos_personal (github.com)

freertos 创建互斥量_STM32CubeIDE+FreeRTOS互斥量实验 在FreeRTOS操作系统中为了降低优先级翻转问题利用了优先级继承算法。优先级继承算法是指,暂时提高某个占有某种资源的低优先级任务的优先级,使之与在所有等待该资源的任务中优先级最高那个任务的优先级相等,而当这个低优先级任务执行完毕释放该资源时,优先级重新回到初始设定值。因此,继承优先级的任务避免了系统资源被任何中间优先级的任务抢占。互斥量与二值信号量最大的不同是:互斥量具有优先级继承机制,而信号量... 阅读详情

相关推荐

stm32——freeRTOS互斥量

在多数情况下,互斥型信号量和二值型信号量非常相似,但是从功能上二值型信号量用于同步,而互斥型信号量用于资源保护。互斥型信号量和二值型信号量还有一个最大的区别,互斥型信号量可以有效解决优先级反转现象。当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先之间的中等优先级任务开始执行——这就会导致一个高优先级任务在等待一个低优先级任务,而低优先级任务却无法执行类似死锁的情形发生。优先级继承:优先级继承就是为了解决优先级反转问题而提出的一种优化机制。

2302_76515999的博客 391

STM32CubeMX FreeRTOS 互斥锁

语句表示调用当前函数,即递归调用。这是为了模拟同一线程在递归调用中多次获取和释放递归互斥锁。为了简化演示,这里使用了延时,模拟任务执行一段时间后再次尝试获取锁。任务执行结束后,相应的资源将被释放。在递归调用返回后,表示退出临界区并释放递归互斥锁。在FreeRTOSConfig.h文件中,确保。在FreeRTOSConfig.h文件中,确保。宏被设置为1,以启用互斥锁。配置串口重定向,选好记得保存。宏被设置为1,以启用互斥锁。配置串口重定向,选好记得保存。在任务执行结束时,调用。二、互斥锁(Mutex)

weixin_46286415的博客 2407

STM32CubeMX之FreeRTOS

STM32CubeMX之FreeRTOS

while(1) 5218

STM32 FreeRTOS (五) 互斥量

当该任务释放这个互斥量时,该互斥量处于开锁状态,任务失去该互斥量的所有权。用互斥量处理不同任务对临界资源的同步访问时,任务想要获得互斥量才能进行资源访问,如果一旦有任务成功获得了互斥量,则互斥量立即变为闭锁状态,此时其他任务会因为获取不到互斥量而不能访问这个资源,任务会根据用户自定义的等待时间进行等待,直到互斥量被持有的任务释放后,其他任务才能获取互斥量从而得以访问该临界资源,此时互斥量再次上锁,如此一来就可以确保每个时刻只有一个任务正在访问这个临界资源,保证了临界资源操作的安全性。

DOF526570的博客 2327

STM32CubeMX中的FreeRTOS的设置之内核参数

摘要 用 STM32CubeMX 建立了一个带有FreeRTOS的项目后,在 Configuration 标签页中,点击右侧窗口中的 FREERTOS 按钮,弹出 FREERTOS Configuration 窗口,内有很多设置参数,本篇重点学习其中 Config parameters 标签下的内核参数。 参考文献 使用Stm32CubeMX+FreeRTOS的组合 FreeRTOS笔记一:配置...

aLife2P6的博客 7577

STM32-9 STM32CubeMX的使用方法

本项目是基于FreeRTOS项目的STM32CubeMX开发方式,说明了具体配置与相关参数,以及mdk使用,裸机也可以参考本配置。

qq_52940987的博客 3288

STM32CubeMX配置FreeRTOS时所有参数详解

STM32CubeMX 中配置 FreeRTOS 时各参数的详细含义与作用

2303_76316997的博客 1990

FreeRTOS递归互斥量实战:在STM32CubeMX中处理‘自我上锁’的LED任务

本文深入探讨了FreeRTOS递归互斥量在STM32CubeMX中的实战应用,解决多任务环境下的'自我上锁'问题。通过详细配置步骤和代码示例,展示了递归互斥量如何安全管理嵌套资源访问,特别适用于LED控制等需要多层调用的场景,提升嵌入式系统的稳定性和效率。

weixin_33695450的博客 157

STM32+HAL库移植FreeRTOS

使用STM32CubeMX创建裸机工程:这里我是用的芯片是STM32F103RBT6,时钟主频为72MHz,配置时钟树: 配置调试串口1: 配置两个LED灯: 由于FreeRTOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器当作超时计数用,FreeRTOS和HAL库不能同时使用SysTick定时器,所在在这里将HAL库的定时器改为其他的定时器,我改成了定时器4: 配置中断,注意这里一定要选择组4,也就是全部为抢占优先级: 输出工程:FreeRTOS源码官网下载地址:https://www.f

Pluto__xu的博客 3852

别再让串口打印乱套了!STM32CubeMX + FreeRTOS 互斥量实战,解决多任务资源抢夺

本文详细介绍了如何使用STM32CubeMX配置FreeRTOS互斥量(Mutex)解决多任务环境下串口打印乱码问题。通过实战案例和优化技巧,帮助开发者实现串口资源的线程安全访问,提升调试效率和系统稳定性。

weixin_30892889的博客 351

FreeRTOS信号量vs互斥锁:用CubeMX配置递归锁保护共享资源的完整流程

本文深入解析FreeRTOS中信号量与互斥锁的核心区别,重点介绍递归互斥锁在物联网设备开发中的实战应用。通过STM32CubeMX配置递归互斥锁的完整流程,展示如何保护多任务共享资源,并提供Keil调试中监控递归调用次数的实用技巧,帮助开发者优化嵌入式系统性能。

weixin_30275415的博客 426

STM32CubeMX的FreeRTOS使用配置

HAL和FreeRTOS快速上手使用

weixin_60301126的博客 4206

使用Jacob实现将Word文件转换为Pdf文件

如果是首次使用 jacob,建议先直接从 github上下载 zip包,因为在实现Word转Pdf的时候,不仅需要用到 jacob.jar,还需要 jacob.dll 库,而zip包中都有。官方使用文档可以参考:https://github.com/freemansoft/jacob-project/blob/main/docs/UsingJacob.md。// 如果安装的是微软的 Office,需要使用 Word.Application。

qq_41672950的博客 750

STM32CubeMX | STM32使用HAL库手动移植FreeRTOS10.4.1

基于HAL库手把手移植FreeRTOS10.4.1 目录基于HAL库手把手移植FreeRTOS10.4.1(一)裸机工程创建(二)移植FreeRTOS (一)裸机工程创建 使用STM32CubeMX创建裸机工程: 这里我是用的芯片是STM32F103RBT6,时钟主频为72MHz,配置时钟树: 配置调试串口1: 配置两个LED灯: 由于FreeRTOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器,所以我们将HAL库的定时器改为其他,这里我该为了定时器4: 配置中断,注意这里一定要选择组4

^_^ 4769

光栅衍射有入射角时_偏振光栅的衍射角度及衍射效率测量

偏振光栅是一种基于入射光的偏振态实现选择性分光的衍射光学元件,衍射角度取决于光栅线数。通过控制入射光的偏振态,偏振光栅能够调控正一阶和负一阶之间的能量分布。当入射光束偏振态不同时,偏振光栅具有不同的衍射特性。理想的偏振光栅:当入射光为右旋圆偏振光时,只有+1级衍射光,衍射光为左旋圆偏振光。当入射光为左旋圆偏振光时,只有-1级衍射光,衍射光为右旋圆偏振光。当入射光为非圆偏振光时,偏振光栅同...

weixin_39552768的博客 6004

educoder 5-3Python 计算思维训练——地图模拟

任务描述 本关任务:利用 Python 实现动画观察近 30 天 4.5 级以上地震发生情况。 相关知识 为了完成本关任务,你需要掌握:1.如何用 Python 从网络获取所需数据;2.如何用 Python 绘制地图 从网络获取数据 URL 处理模块(库) 在这里插入代码片 import urllib.request as req 创建一个表示远程 url 的类文件对象 urllib.urlopen(" ") 如同本地文件一样读取内容 print data的输出结果: 摘取动画所需数据

Manonll的博客 2488

STM32CUBEMX+FREERTOS使用软件定时器osTimerStart

一、配置STM32CUBEMX 1、开启FreeRTOS 新建一个 CubeMX 工程,在配置好时钟后,点击 Middleware -> 选择 FreeRTOS -> 下拉框选择 V1 版本 CMSIS 2、配置界面 配置项 功能 Tasks and Queues 任务与队列,用于配置任务体以及消息队列; Timers and Semaphores 软件定时器与信号量,用于配置内核对象 (软件定时器和信号量) Mutexes 互斥量,用于配置内核对象(互斥量) Eve

yongridada的博客 3938

【Unity3D】关于unity中spriteAtlas的打包方案及使用时内存状态的多组对照实验

unity项目中使用精灵(Sprite)为了降低性能消耗,我们可以使用精灵图集(Sprite Atlas)技术,它能够将多个纹理合并成一个大纹理

云渊寒烬 5101

CubeMX配置FreeRTOS跑多线程任务

前言:想起以前用标准库做RTOS的时候一大堆操作就很烦,还好MX支持了直接配置生成RTOS工程很方便,最近发现一些很久以前买的模块没用上放着占地方然后顺便拿出来做了个小遥控器玩玩,下面给遥控器配个RTOS跑跑。 软件: STM32CubeMX V5.3.0 固件库版本: STM32Cube FW_F1 V1.8.0 硬件: STM32F103C8T6 0.96寸IIC接口OLED ...

linzs.online 1万+

camera 知识速查

本文总结了Camera开发中的常见问题排查方法和关键技术点。主要内容包括:I2C/MIPI不通的排查步骤、时序问题分析方法、Sensor/AF/Flash/PDAF的Bring Up流程、OTP调试方法、PDAF原理及调试、CTS/ITS问题解决思路、AE震荡解决方案、Systrace性能分析方法、Flicker产生原理、Tombstone问题定位等。还涉及V4L2框架解析、问题定位分层方法、Sensor Setting注意事项、时钟信号概念、第三方应用卡顿排查、大光圈概念、Monkey测试方法。

qq_41665131的博客 784

DLMS-Blue-Book蓝皮书—曲线类

attribute_index 1 指的是第 1 个属性(即 logical_name),attribute_index 2 指的是第 2 个属性,等等;如果其他“曲线通用类”对象捕获了这个缓冲区,它们的缓冲区也将被清空,以保证它们的缓冲区条目是同质的。如果捕获对象是曲线通用类的缓冲区,则 data_index 标识缓冲区(即列)中的捕获对象(即内部曲线通用类中的列);如果曲线通用类已排序,则调用捕获方法将把新条目存储在缓冲区中的适当位置,移动所有后续条目,并可能丢失最不相关的条目。

一个bug是bug,多个bug能work 1454

FreeRTOS递归互斥信号量实战:如何避免优先级反转的坑(附STM32完整代码)

本文深入解析FreeRTOS递归互斥信号量的原理与应用,通过STM32实战案例展示如何避免优先级反转问题。详细介绍了递归互斥信号量的创建、嵌套获取与释放操作,以及在STM32CubeMX中的配置方法,帮助开发者高效管理多任务资源竞争。

pz890123的博客 1022

Pointnet++环境配置(Windows11和ubuntu)及训练教程

PS:前两行命令是数据处理的命令,主要是进行数据读取和生成相应的训练数据格式,在Ubuntu上是正常运行的,在Windows上运行会失败,无法生成训练用的数据格式,所以最好在Ubuntu上训练,如果一定要用Windows,可以ubuntu上生成数据格式在导到Windows上,数据生成不需要安装torch。通过anaconda配置的环境,在官网找的命令安装的,版本是2.1.0+cu118。训练命令:我使用的pycharm,直接在pycharm中打开终端,运行命令。Python版本:3.7。

AIcurator的博客 2558

STM32裸机开发转FreeRTOS教程

通过本教程,你已经学会了如何将 FreeRTOS 移植到 STM32 裸机项目中,并创建简单的任务。从裸机开发过渡到使用 FreeRTOS 可以帮助你更好地管理多任务,提高系统的性能和可维护性。在实际项目中,你可以根据需求创建更多的任务,并使用 FreeRTOS 提供的各种功能,如信号量、队列等,来实现任务间的同步和通信。✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进❤欢迎关注我的知乎:对error视而不见代码获取、问题探讨及文章转载可私信。

duierrorshuobu的博客 1066

ADRC自抗扰算法优化(PLC梯形图篇)

ADRC自抗扰算法PLC梯形图完整源代码请参看下面博客文章:ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法_RXXW_Dor的博客-优快云博客PLC的自抗扰控制(ADRC)算法_RXXW_Dor的博客-优快云博客_adrc算法1、自抗扰控制算法,网上很多文章有所讲解,大家也可以关注韩京清教授的论文和书籍,这里就不赘述了,下面给出梯形图+SCL代码。

RXXW_Dor的博客 2283

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

STM32手动移植FreeRTOS(非常详细且通用,以STM32H743为例)

FreeRTOS移植到hal库的STM32简明指南

2301_80039176的博客 2124

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 【FreeRtos教程五】STM32 CubeMx——Binary and Counting Semaphore(二进制信号量和计数型信号量)
下一篇: 【FreeRtos教程七】STM32 CubeMx——EventGroup(事件组)
Joseph Wen
博客等级 码龄8年 249粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值