• 自己的第一个FreeRTOS程序


    首先我们来了解什么是任务

    在FreeRTOS中,任务就是一个函数,原型如下:

    void ATaskFunction( void *pvParameters );
    

    要注意的是:

    这个函数不能返回
    同一个函数,可以用来创建多个任务;换句话说,多个任务可以运行同一个函数
    函数内部,尽量使用局部变量:
    1.每个任务都有自己的栈
    2.每个任务运行这个函数时
    任务A的局部变量放在任务A的栈里、任务B的局部变量放在任务B的栈里
    不同任务的局部变量,有自己的副本
    函数使用全局变量、静态变量的话
    只有一个副本:多个任务使用的是同一个副本
    要防止冲突

    创建任务

    创建任务时使用的函数如下:

    1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
    2. const char * const pcName, // 任务的名字
    3. const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位
    4. 为word,10表示40字节
    5. void * const pvParameters, // 调用任务函数时传入的参数
    6. UBaseType_t uxPriority, // 优先级
    7. TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用
    8. 它来操作这个任务

    这是创建任务之前的函数,话不多说,我们来实操。

    修改stm32f1xx_it.c文件

    因为我们是HAL移植,所以系统中断还没有配置好,我们现在来配置中断。

    1.添加下面三个函数

    1. extern void xPortPendSVHandler(void);
    2. extern void xPortSysTickHandler(void);
    3. extern void vPortSVCHandler(void);

     2.修改SVC_Handler()函数

    1. void SVC_Handler(void)
    2. {
    3. vPortSVCHandler();
    4. }

    3.修改PendSV_Handler()函数

    1. void PendSV_Handler(void)
    2. {
    3. xPortPendSVHandler();
    4. }

    4.修改SysTick_Handler()函数

    1. void SysTick_Handler(void)
    2. {
    3. xPortSysTickHandler();
    4. }

    主函数编写

    1. int main(void)
    2. {
    3. HAL_Init();
    4. SystemClock_Config();
    5. USART1_Init(115200,NULL,NULL);
    6. //printf("Hello World!\r\n");
    7. xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
    8. xTaskCreate(Task2Function,"Task2",100,NULL,1,&xHandleTask2);
    9. vTaskStartScheduler();
    10. while (1)
    11. {
    12. }
    13. }

    可见我们在主函数里创建了两个任务,并根据函数,传对应的参数,栈的深度可以自己定义大小,只要不溢出就行,后续我就讲解如何分配栈的大小,优先级自行决定。

    1. TaskHandle_t xHandleTask1;
    2. TaskHandle_t xHandleTask2;
    3. void Task1Function( void * param)
    4. {
    5. while(1)
    6. {
    7. printf("1\r\n");
    8. }
    9. }
    10. void Task2Function( void * param)
    11. {
    12. while(1)
    13. {
    14. printf("2\r\n");
    15. }
    16. }

    这是上面的任务函数,要注意在函数里面是一直循环的是不会停止的,我们就算创建多个任务,也是在交替进行的。

    我们再进行编译烧录,查看串口助手,就可以发现我们的两个任务都在交替执行。

  • 相关阅读:
    警惕!新增1本SCI被标记“On Hold”!
    Demo24各位相加
    Dubbo源码-Provider服务端ServiceBean初始化和属性注入
    SQL server中:常见问题汇总(如:修改表时不允许修改表结构、将截断字符串或二进制数据等)
    odoo17 web.assets_web.min.js 赏析
    Shiro授权以及注解开发
    LeetCode 2895. 最小处理时间【贪心,排序】1351
    abaqus在仿真过程中中断了,这是为什么
    motionface respeak视频一键对口型
    @Profile注解的作用是什么?
  • 原文地址:https://blog.csdn.net/ljt2333/article/details/133089490