首页 > 代码库 > CMSIS_RTOS 之点灯
CMSIS_RTOS 之点灯
RTX作为MDK自带的操作系统,比起ucOS使用之前先要做一大堆移植工作,无疑是要简单多了。
只需要在RTE里面把想要的勾上,保证下面不会有警告,所有的勾勾都是绿色的,就算配置成功,可以直接用了。
参照官方例程很快就可以点上灯:
首先在App1.C里面的内容,定义好一个任务。
#include<main.h>void job1 (voidconst*argument){// thread function ‘job1‘while(1){bsp_led_toggle(2);osDelay (200);// delay execution for 10 milliseconds}}
注意将该任务作为一个函数extern出去,使之在main文件里面能够调用函数名。
然后在main文件里面配置该任务的优先级,任务的实例数量,任务的堆栈大小
osThreadDef(job1, osPriorityAboveNormal,1,0);// define job1 as thread function
再在main函数里面初始化并开始就可以了
int main(void)
{
osThreadId id_job1;
/* STM32F4xx HAL library initialization:
- Configure the Flash prefetch, Flash preread and Buffer caches
- Systick timer is configured by default as source of time base, but user
can eventually implement his proper time base source (a general purpose
timer for example or other time source), keeping in mind that Time base
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
handled in milliseconds basis.
- Low Level Initialization
*/
HAL_Init();
/* Configure the System clock to have a frequency of 168 MHz */
SystemClock_Config();
bsp_led_init();
osKernelInitialize();
id_job1 = osThreadCreate (osThread(job1),NULL);
osKernelStart();
}
直接编译,下载,运行,就可以看到闪灯了!非常快。
接下来我开始看RTX帮助文档的时候,看到 osThreadDef 有任务实例个数,以及堆栈大小两个参数。我对RTX的堆栈设置还不是很了解,但是这个任务实例个数应该还是比较好理解的,意思就是我可以运行好几个QQ呗。
但是我需要登录不同的账号,也就是说我的不同的任务需要有不同的参数。回头看到任务的声明以及开始任务的时候,确实有传递参数的位置((void const *argument)),折腾了一会儿,终于把参数传递进去了。
以下为我的理解(不对还请更正):
void const *arg : 指的是arg是一个指针类型,它可以指向任意类型。指针指向的具体的值是不可以修改的,但是指针本身的位置是可以修改的(但是一般不会去动的吧)。
具体使用的时候参见下文:
void job1 (voidconst*argument){// thread function ‘job1‘
int*ptr;
ptr =(int*)argument;
while(1){
bsp_led_toggle(*ptr);
osDelay (200);// delay execution for 10 milliseconds
}
}
此时我定义了两个进程实例,然后自定义任务堆栈为250
- osThreadDef(job1, osPriorityAboveNormal, 2, 250); // define job1 as thread function/* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/int tt1 = 1;int tt2 = 2;
然后再main里面定义两个任务:
int main(void)
{
osThreadId id_job1;
/* STM32F4xx HAL library initialization:
- Configure the Flash prefetch, Flash preread and Buffer caches
- Systick timer is configured by default as source of time base, but user
can eventually implement his proper time base source (a general purpose
timer for example or other time source), keeping in mind that Time base
duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
handled in milliseconds basis.
- Low Level Initialization
*/
HAL_Init();
/* Configure the System clock to have a frequency of 168 MHz */
SystemClock_Config();
bsp_led_init();
osKernelInitialize();
id_job1 = osThreadCreate (osThread(job1),(void*)&tt1);
id_job1 = osThreadCreate (osThread(job1),(void*)&tt2);
osKernelStart();
}
这样,就可以看到两盏灯同时在闪了。
CMSIS_RTOS 之点灯
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。