裸机与跑RTOS实时操作系统的比较

1. 裸机应用代码框架

正常的裸机应用代码架构,由一个大while循环以及一些中断服务函数构成。如下图所示,中断服务函数叫前台程序,大while叫后台程序。这种前后台式的工作系统,本质上还是一个单任务的系统。

相对而言,单任务的系统实时性较差,后台的各个任务,不管紧急程序有多高,都要排着队轮循。

伪代码示例:

void main(void)
{
        sys_init();
        while(1)
        {
                task1();
                task2();
                task3();
                feeddog();
        }
}

void ISR1_handler(void)
{
        dosomthing();
}

2. 跑RTOS的应用代码框架

实时操作系统是一个的多任务系统,应用代码可以根据架构、功能、紧急程度等细分为多个任务,每个任务所消耗的资源相互独立,任务与任务间可以通过信号量,消息队列,事件组等进行同步和数据交换。

如下图所示,是freertos的一个抢占式的实时多任务系统。通过任务调度,使得这些任务高效有序的“并发”进行。

根据任务优先等级的设定,来决定当前CPU的使用权归于哪个任务。高优先级的任务可以打断低优先级的任务,中断可以打断高优先级的任务。这样就可以保证紧急的任务都能够及时的响应。

伪代码示例:

void main(void)
{
        sys_init();
        //操作系统的创建任务的API函数,创建一个开始任务
        xTaskCreate  (start_task,    
                   "start_task", 
                    configMINIMAL_STACK_SIZE,  
                    NULL,   
                    1, 
                    StartTaskHandle); 
        //调度器开始调度任务           
        vTaskStartScheduler();  
         //正常走不到这里            
        while(1)                           
        {
                printf("task does not work!!!\r\n ")
        }                      
}

void start_task(void)
{
            //创建task1  
          xTaskCreate  (task1,  
                       "task1", 
                       configMINIMAL_STACK_SIZE,   
                       NULL,   
                       1, 
                       Task1Handle);  
           //创建task2              
          xTaskCreate  (task2,  
                       "task2"  , 
                        configMINIMAL_STACK_SIZE, 
                        NULL,   
                        1, 
                        Task2Handle);  
          //创建task3              
          xTaskCreate  (task3,  
                        "task3", 
                        configMINIMAL_STACK_SIZE, 
                        NULL, 
                        1, 
                        Task3Handle);   
           //删除stark_task             
          vTaskDelete(StartTaskHandle);            
}

void task1(void)
{
        while(1)
        {
                task1_dosomething();
                printf("task1 is working!!!\r\n");
        }
}

void task2(void)
{
        while(1)
        {
                task2_dosomething();
                printf("task2 is working!!!\r\n");
        }
}

void task3(void)
{
        while(1)
        {
                task3_dosomething();
                printf("task3 is working!!!\r\n");
        }
}


void ISR1_handler(void)
{
        dosomthing();
}

3. 比较

裸机

跑操作系统

实时性

一般

良好

可靠性

一般,某一处死循环后,导致整个功能瘫痪

良好,单个任务的死机不影响其他任务

资源消耗

所有资源都用在了应用代码功能上

需要一部分ram和rom的资源给操作系统

使用范围

功能简单,实时性可靠性要求不高的系统

功能复杂,需要满足实时性可靠性要求的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值