我希望:从今天开始你可以彻底抛离裸奔的方式,不论你在开发多么复杂的软件系统还是一个多么简单的软件应用,不论你对RTOS有多么的陌生,哪怕只是听说过从没用过,不论你写的代码有多少坑,勇敢去尝试,我相信他会给你打开一扇新的大门。从今天开始,我也在告诫自己再也不许回到那个裸奔时代,人可以走弯路,但不能走回头路。
————程序小白,
======================万事开头皆例程========================
1. 选择我们的例程,并且保存到本地。
2. ESP32是有两个CPU组成的,你可以选择任务运行在哪个核心上:
3. 在setup中调用任务创建函数xTaskCreatePinnedToCore,创建任务:
4. 创建任务以后,任务会自动开始运行,这个时候loop函数其实没什么用了:
===============setup——loop机制的由来===================
你好不好奇setup——loop机制到底从何而来?
当你新建一个工程的时候,你会发现自动给到我们的就是setup和loop函数:
接下来给出答案:
其实setup和loop本身就是在任务中被调用,而我们在loopTask任务中创建了新的任务,也就是程序开始执行就跳入了一个任务中,后续所有的代码运行环境都是任务级。在我们的例程中实际的运行是在三个任务之间不断的切换。
细心的道友会发现在app_main()函数中调用的任务创建函数 和 我们在示例中调用的任务创建函数是不一样的:
xTaskCreateUniversal 和 xTaskCreatePinnedToCore 到底有哪些区别。
xTaskCreate 和 xTaskCreatePinnedToCore 到底有哪些区别。
===============ESP32提供了freertos全套的接口文件==================
================freertos源文件以lib库的形式提供===================
====================xTaskCreate 原型=======================
==================程序员眼中的xTaskCreate ====================
=================freertos眼中的xTaskCreate =====================
任务句柄:pvCreatedTask用于获取任务状态的控制块,改变任务控制块就可以控制任务的状态转换。
任务优先级:uxPriority ,一个应用中永远都不止只有一个任务准备就绪,等待获取CPU资源,同时就绪的任务,就需要任务优先级进行排队处理。
任务栈:任务栈的目的时保存当一个任务由运行到中断状态切换时,任务当前执行的上下文环境,等任务再次就绪后,执行任务栈可以从任务中断的位置继续执行该任务。
结论:引入了RTOS以后(其实不论他是不是free),实际可控的空间就越来越广了,以前除了中断,你无法打断一个函数的执行,哪怕应用中断任务化,你也无法将所有的任务全部放入中断,中断只是一个特殊的任务级切换应用。它有助于你理解任务的切换,但他并不等同与任务。