rtos系统c语言,让我们来学习RTOS,自己写RTOS

本文介绍了作者在阅读ucos后,借鉴其他操作系统实现的ZRTOS,包括内存分配、多任务切换、消息邮箱、信号量和互斥量等功能。通过汇编代码展示了任务切换的关键部分,并提供了任务调度器的C语言实现,同时列出了ZRTOS的API函数及其用途。
摘要由CSDN通过智能技术生成

本帖最后由 lotoohe 于 2016-8-24 08:24 编辑

该RTOS系统命名为ZRTOS,是我在阅读了ucos后,并且借鉴了其它操作系统后实现的,完成了一些基础的工作,可以拿过来学习,也可以进行简单的应用。

笔者独自完成了内存分配算法,多任务切换,消息邮箱,信号量,互斥量等,在其中也学到了非常多的东西。

声明:仅供学习!

要自写一个操作系统,我们首先要实现的就是任务切换,再其次是任务调度(高优先级先执行,同优先级时间片分割执行),然后再是消息邮箱,信号量,互斥量等等。

下面我们来看看任务切换的实现,这部分的代码只能由汇编语言来完成,在handler.s中有任务切换的具体代码:

我们的任务板是stm32,stm32是基于cortex-m3内核的,所以在写这个系统的时候很多参照了cortex-m3内核的文档,其中包括了pendsv中断向量,与中断压栈以及堆栈指针等方面。在设计中中断任务我们用的是msp堆栈指针,而我们的任务使用的是psp指针,我们在汇编代码中开启了psp指针的使用以后就,cpu就会自动的进行切换了:

开全局与关全局中断的代码:[mw_shl_code=asm,true]enter_int

export enter_int

CPSID I

4bf43b75943419c055cc812f1f911a84.gifRIMASK=1 关中断

BX LR ;返回

exit_int

export exit_int

CPSIE I        ;开中断

BX LR ;返回[/mw_shl_code]第一次启动操作系统,我们往往需要初始化psp指针,设置pendsv中断为最低的优先级,然后开始一次调度:

[mw_shl_code=asm,true];开启操作系统

start_os        proc

export start_os

CPSID   I

;首先设置pendsv为最低优先级

;设置pendsv的中断优先级

ldr r0,=0xE000ED22

;最低优先级

ldr r1,=0xff

;设置

strb r1,[r0]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个简单的RTOS实时操作系统可以分为以下步骤: 1. 确定系统结构和功能:根据实际需求,定义系统的结构和功能,例如需要哪些任务、任务的优先级、任务之间的通信方式、任务的调度方式等。 2. 确定任务:确定系统中需要运行的任务,包括任务的优先级、任务的执行时间、任务的输入输出等信息。 3. 任务代码:编每个任务的代码,实现任务的具体功能。 4. 编任务调度程序:编任务调度程序,实现任务的调度和切换,包括任务切换时的上下文保存和恢复等操作。 5. 编操作系统内核:编操作系统内核,包括任务管理、内存管理、中断处理、时钟管理等模块。 6. 测试和调试:对编RTOS系统进行测试和调试,确保系统稳定可靠。 以下是一个简单的RTOS示例代码,用于实现两个任务的切换: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/time.h> #include <pthread.h> #define TASK1_PRIORITY 1 #define TASK2_PRIORITY 2 int task1_count = 0; int task2_count = 0; void task1() { while (1) { task1_count++; printf("Task1: %d\n", task1_count); usleep(500000); // 切换到任务2 pthread_exit(NULL); } } void task2() { while (1) { task2_count++; printf("Task2: %d\n", task2_count); usleep(500000); // 切换到任务1 pthread_exit(NULL); } } int main() { pthread_t task1_thread, task2_thread; // 创建任务1 pthread_create(&task1_thread, NULL, task1, NULL); // 创建任务2 pthread_create(&task2_thread, NULL, task2, NULL); // 等待任务结束 pthread_join(task1_thread, NULL); pthread_join(task2_thread, NULL); return 0; } ``` 这个示例中,我们使用了 `pthread` 库来创建线程来模拟任务。在任务中,我们使用了一个循环来模拟任务的工作,然后使用 `usleep` 函数来让任务等待一段时间后再切换到另一个任务。在主函数中,我们使用 `pthread_join` 函数来等待任务的结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值