zoukankan      html  css  js  c++  java
  • STM32F103移值FreeRtos笔记

    RTOS版本:FreeRTOS_V8.2.2

    一、下载FreeRTOS源文件
           这个可以在百度上下载,或者在官网上面下载http://www.freertos.org/a00104.html
           下图位置即可下载了

           目前最新版本是8.2.2
    二、下载源码下来,解压,将源码添加到工程
          2.1 新建一个移植工程(拷贝原子哥的也行),在工程中新建一个文件夹FreeRTOS存放源码
          2.2 打开解压到的源码“..FreeRTOSv8.2.2”,里边有几个文件夹和文件等东西

    看到上图中红色圈圈的就是源码了,整个文件夹拷贝到新建工程的“FreeRTOS”文件夹中
    2.4 在源码文件夹中“..FreeRTOSv8.2.2FreeRTOSDemoCORTEX_STM32F103_Keil”这个路径下,找到文件“FreeRTOSConfig.h”,拷贝到工程文件夹“FreeRTOS”中

    三、打开MDK软件,新建工程,添加文件

    添加文件如上如所示,红色框框就是添加的FreeRTOS文件了;
    “port.c”文件路径..FreeRTOSSourceportableRVDSARM_CM3
    “heap_2.c”文件路径..FreeRTOSSourceportableMemMang
    “list.c”、“queue.c”、“tasks.c”文件路径..FreeRTOSSource

    五、完成以上工作之后,编写main函数了

    #include "FreeRTOS.h"
    #include "task.h"
    #include "queue.h"
    #include "misc.h"
    #include "led.h"

    void LED0_Task(void *pvParameters);
    void LED1_Task(void *pvParameters);


    int main()
    {     
       LED_Init();              //初始化与LED连接的硬件接口
       xTaskCreate(LED0_Task,(const char *)"LED0",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+3,NULL);
       xTaskCreate(LED1_Task,(const char *)"LED1",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+4,NULL);
       vTaskStartScheduler();
    }

    void LED0_Task(void *pvParameters)
    {
       while(1)
       {
           LED0=!LED0;
           vTaskDelay(1000/portTICK_RATE_MS);
       }
    }

    void LED1_Task(void *pvParameters)
    {
       while(1)
       {
           LED1=!LED1;
           vTaskDelay(300/portTICK_RATE_MS);
       }
    }

    只设置了两个LED,按照不同的频率闪烁

    六、修改启动文件,首先见启动文件的只读属性去掉,否则修改不了(已经去掉的就略过了)

    为什么这么改,我也不明白,IMPORT和EXPORT一个是调用内部引用文件,一个是调用外部引用文件,就和C语音写extern意思差不多。修改这几个地方将函数名和port.c文件中的相同就性了,好调用freertos的函数

    七、搞定之后,就开始编译改错了,完成后就下载,看到两个灯按照不同的频率在闪烁,呵呵

    八、上面差不多也算大功告成了,另外在中断的时候怎么办,需要保护机制。

    //外部中断2服务程序
    void EXTI2_IRQHandler(void)
    {
       taskENTER_CRITICAL();

       delay_us(1000);
       if(KEY2==0)      //按键KEY2
       {
           BEEP=!BEEP;
       }    
       
       EXTI_ClearITPendingBit(EXTI_Line2);  //清除LINE2上的中断标志位  
       taskEXIT_CRITICAL();
    }

    测试了下,在两个灯的基础上,写了一个KEY(用中断方式)触发蜂鸣器,也是可行的。

    上面理解了,基本上算入门了,下面主要还是研究UCOS-III,虽然freertos是完全免费的,UCOS需要收费,但是在国内的公司,只要不出口,还是用UCOS的多,混口饭吃还是随大流了,思维方式差不多

    我总结了攻城狮在MCU时间利用率上有三个阶段

    第一个阶段,只要有延时就采用delay方法,死等,不碰个头破血流不回头

    第二个阶段,采用标志位,之前我一直是这样的,我要10ms检测一个东西,我会设置一个主定时,不断的查询到了没有,到了才执行,不到就执行其他事情

    第三个阶段,采用操作系统,把上面查询的时间也省了,一个任务完成了,会自动进入到下一个优先级高的地方去,虽然有空闲模式,但是在任务集中的时候,效率还是很高的。

  • 相关阅读:
    CSS资料:IE8 CSS hack
    作为前端制作师你必须知道的事情!
    TABLE的1PT边框
    IE6 png图片的支持
    开源公司IronTec将推动PHP进驻Android平台
    终于解决了FLASH 播放器的问题了
    Windows7 添加快速启动栏
    不能调试存储过程的解决方法
    给Asp.Net Forums的后台管理菜单做一个树形外衣
    Asp.net Forums与Cnforums研究文章集合
  • 原文地址:https://www.cnblogs.com/wt88/p/9767615.html
Copyright © 2011-2022 走看看