当前位置: 首页 > news >正文

太原建站塔山双喜广西seo公司

太原建站塔山双喜,广西seo公司,高端论坛网站建设,wordpress 调用当前分类文章声明:该系列笔记是参考韦东山老师的视频,链接放在最后!!! rtos:这种系统只实现了内核功能,比较简单,在嵌入式开发中,某些情况下我们只需要多任务,而不需要文件…

        声明:该系列笔记是参考韦东山老师的视频,链接放在最后!!!

        rtos:这种系统只实现了内核功能,比较简单,在嵌入式开发中,某些情况下我们只需要多任务,而不需要文件功能,相反带上了文件工能反而对内存有限的单片机反而是一种负担。

        裸机开发程序执行流程:如果没有操作系统的的使用称为裸机开发,如果在while()循环里面有两个调度函数需要执行,程序执行顺序是在执行完A函数之后,才会去执行B函数。

int main()
{while(1)
{Mother_Freed();//A函数Mother_Message();//B函数
}
return 0;
}

 

        这就造成了一个问题,那就是,在执行A函数的期间B函数是得不到相应的,只能等待A函数,执行结束,A函数是喂孩子,B函数是回复消息,如果B函数执行时间过长,不执行A函数孩子是不是就饿死了。为了解决这个问题可以加入操作系统,也就是freertos。

        rtos开发程序执行流程:rtos操作系统会将执行函数,封装为任务,每个任务分配时间达到时间切换任务,由于分配时间较短,在外界看来就是同时执行多任务,使用操作系统就可以解决上面的难题。

             

            

void Mother_Freed(void);//声明函数
void Mother_Message(void);//声明函数int main()
{
create_task(喂饭);//创建任务 
create_task(发消息);//创建任务
start_scheduler();//执行任务调度器
while(1)
{
sleep();
}}
void Mother_Freed(void)//封装
{
while(1)
{
Mother_free();//调用函数喂饭
}
}
void Mother_Message(void)//封装
{
while(1)
{
Mother_message();//调用函数发消息
}
}

        rtos互斥操作:在操作系统中,同时执行多个任务的时候,如果多任务访问同一资源,就会发生互斥,这个时候会出现数据混乱,有可能出现死锁,可以通过软件加入变量,互斥使用系统资源。

int g_canuse = 1;
03
04 void uart_print(char *str)
05 {
06     if (g_canuse)
07 {
08     g_canuse = 0;
09     printf(str);
10     g_canuse = 1;
11 }
12 }
13
14 task_A()
15 {
16     while (1)
17 {
18     uart_print("0123456789\n");
19 }
20 }
21
22 task_B()
23 {
24     while (1)
25 { uart_print("abcdefghij");
27 }
28 }
29
30 void main()
31 {
32 // 创建 2 个任务
33     create_task(task_A);
34     create_task(task_B);
35 // 启动调度器
36     start_scheduler();
37 }

       当 g_canuse = 0;这个变量等于0的时候,就可以,对大多数访问同一资源的情况出现互斥,但是只是大部分,因为rtos这个操作系统,在执行任务转换的时候,A执行进入if函数转换,B函数执行printf();执行一般转换,在执行A就会发现打印出来的数字还是乱码的情况,但是可以避免大部分情况。

        出现上面的原因是因为,先变量判断在赋值,如果我们将赋值提前可以避免,出现失误嘛,如果,我们将usart_printf();这个函数重新定义为一下格式,会不会完全避免这种情况。

01 void uart_print(char *str)
02 {
03 g_canuse--; ① 减一
04 if( g_canuse == 0 ) ② 判断
05 {
06 printf(str); ③ 打印
07 }
08 g_canuse++; ④ 加一
09 }

        这里即使将变量赋值提前,但是还是会出现打印出错的情况,语句1的执行可以分为3个步奏,1从内存读取变量的值放入寄存器2修改寄存器的值让变量减1 3把寄存器的值写到内存变量上面如果执行12切换到B任务,此时变量还是1,B任务执行进行printf打印一半进行切换,A任务会从打断地方执行,也能进入if函数,这个时候打印出来也会是混乱的值。

        当我们使用rtos,写多任务程序的时候一定要注意,函数资源互斥问题,任何一种操作系统都会提供相应的函数。

         rtos互斥操作:如果任务之间有依赖关系,比如任务 A 执行了某个操作之后,需要任务 B 进行后续的处理。如果代码如下编写的话,任务 B 大部分时间做的都是无用功。

// RTOS 程序
02 int flag = 0;
03
04 void task_A()
05 {
06 while (1)
07 {
08 // 做某些复杂的事情
09 // 完成后把 flag 设置为 1
10 flag = 1;
11 }
12 }
13
14 void task_B()
15 {
16 while (1)
17 {
18 if (flag)
19 {
20 // 做后续的操作
21 }
22 }
23 }
24
25 void main()
26 {
27 // 创建 2 个任务
28 create_task(task_A);
29 create_task(task_B);
30 // 启动调度器
31 start_scheduler();
32 }
上述代码中,在任务 A 没有设置 flag 为 1 之前,任务 B 的代码都只是去判断 flag。而
任务 A、B 的函数是依次轮流运行的,假设系统运行了 100 秒,其中任务 A 总共运行了 50
秒,任务 B 总共运行了 50 秒,任务 A 在努力处理复杂的运算,任务 B 仅仅是浪费 CPU 资源。
如果可以让任务 B 阻塞,即让任务 B 不参与调度,那么任务 A 就可以独占 CPU 资源加快
处理复杂的事情。当任务 A 处理完事情后,再唤醒任务 B。示例代码如下:
// RTOS 程序
02 void task_A()
03 {
04 while (1)
05 {
06 // 做某些复杂的事情
07 // 释放信号量,会唤醒任务 B;
08 }
09 }
10
11 void task_B()
12 {
13 while (1)
14 {
百问网
13
15 // 等待信号量, 会让任务 B 阻塞
16 // 做后续的操作
17 }
18 }
19
20 void main()
21 {
22 // 创建 2 个任务
23 create_task(task_A);
24 create_task(task_B);
25 // 启动调度器
26 start_scheduler();
27 }

http://www.hkea.cn/news/112233/

相关文章:

  • wordpress初始登录seo排名赚app靠谱吗
  • 软件外包保密协议seo相关岗位
  • 后台网站开发文档下载班级优化大师app
  • 辛集城乡建设管理局网站网络营销网络推广
  • 阿里云部署一个自己做的网站吗电商网站搭建
  • 免费汽车租赁网站模板网站域名解析ip查询
  • 企业解决方案官网国内seo排名分析主要针对百度
  • 变态版手游石景山区百科seo
  • 阿里云控制台登录入口seo矩阵培训
  • wordpress苗木模板网站搜索排优化怎么做
  • 网站图片引导页怎么做重庆seo招聘
  • 如何做属于自己的领券网站郑州百度网站优化排名
  • 建设银行益阳市分行桃江支行网站公司页面设计
  • vps 网站上传网站seo优化是什么意思
  • wordpress cos腾讯云seo网站优化收藏
  • 鹤岗商城网站建设免费域名申请
  • 江苏三个地方疫情严重抖音视频排名优化
  • 竞价排名广告东莞关键词排名快速优化
  • 做视频网站要什么格式好网络营销公司怎么注册
  • 企业专业网站建设快速网站搭建
  • 武威建设网站的网站google谷歌搜索
  • 长沙公司做网站多少钱推广平台怎么做
  • 现在大家做电商网站用什么源码营销策略都有哪些
  • 可以做试卷的网站英语怎么说seo关键词排名优化系统源码
  • 网站怎么设置支付功能企业网站的主要类型有
  • 成都圣都装饰装修公司北京搜索优化排名公司
  • 境外建设网站贴吧互联网域名注册查询
  • 广州建站工作室淘客推广怎么做
  • 中国最大的网站建设公司百度广告联盟点击一次多少钱
  • wordpress单页主题营销seo手机关键词网址