你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

移植到STM8上的协同式操作系统  

[复制链接]
holts1 发布时间:2015-1-12 13:56
本帖最后由 holts1 于 2015-1-14 10:26 编辑

如 题, 裸奔虽然爽,但安排任务太过麻烦, 操作系统可以简化工作,提高开发效率
收藏 3 评论38 发布时间:2015-1-12 13:56

举报

38个回答
holts1 回答时间:2015-1-13 16:03:26
jeromeRo 发表于 2015-1-13 14:05
裸奔的,到现在我还是二货,只会裸奔

贴个参考别人的例子改的,带操作系统的代码, 给XD参考下,提提意见。




  1. #include "ptask.h"
  2. #include "stm8s.h"

  3. /* Private typedef ---------------------------------------------*/
  4. /* Private define ----------------------------------------------*/
  5. #define LED_GPIO_PORT  (GPIOA)
  6. #define LED_GPIO_PINS  (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3)
  7. #define SW_4  GPIO_PIN_1
  8. #define SW_5  GPIO_PIN_2
  9. #define LED_RUN_OR_WAIT   GPIO_PIN_3

  10. #define LED_GPIO_PORT2 (GPIOC)
  11. #define LED_GPIO_PINS2 (GPIO_PIN_5 | GPIO_PIN_6)  
  12. #define LED_WAIT   GPIO_PIN_5
  13. #define LED_RUN3   GPIO_PIN_6

  14. #define LED_GPIO_PORT3 (GPIOD)
  15. #define LED_GPIO_PINS3 (GPIO_PIN_6)
  16. #define LED_RUN    GPIO_PIN_6

  17. #define KEY_GPIO_PORT  (GPIOD)
  18. #define KEY_GPIO_PINS  (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 )
  19. #define KEY_POWER   GPIO_PIN_1   
  20. #define KEY_REDUCE   GPIO_PIN_2
  21. #define KEY_PLUS  GPIO_PIN_3

  22. #define KEY_MODE_PINS (GPIO_PIN_4)
  23. #define KEY_MODE    GPIO_PIN_4
  24. #define KEY_TRIGGER_PINS (GPIO_PIN_5)
  25. #define KEY_TRIGGER  GPIO_PIN_5

  26. #define KEY_GPIO_PORT2  (GPIOC)
  27. #define KEY_SW_PINS (GPIO_PIN_7)
  28. #define KEY_SW    GPIO_PIN_7

  29. #define MilliSec        1
  30. #define Sec             1000

  31. #define STEP            5   //约5%
  32. #define MAX             70  //100%
  33. #define MIN             15  //约21%

  34. #define OFF             0
  35. #define ON              1
  36. #define RUN             2
  37. #define WAIT            3

  38. #define TIM4_PERIOD     124   //1ms定时

  39. /* Private macro -----------------------------------------------*/
  40. /* Private variables -------------------------------------------*/
  41. /* Private function prototypes ---------------------------------*/
  42. void GPIO_Configuration(void);
  43. void TIM4_Config(void);

  44. void task0(void);
  45. void task1(void);

  46. /* Private functions -------------------------------------------*/
  47. /* Global variables --------------------------------------------*/
  48. volatile unsigned char timers[MAXTASKS]={0};

  49. unsigned char Trg;
  50. unsigned char Cont;

  51. unsigned char  BlinkOfNumber = 0;

  52. unsigned char DutyCycle;
  53. unsigned char Mode;
  54. unsigned char ChangeFlag = 1;

  55. unsigned char SaveFlag;
  56. unsigned int SaveDelay;

  57. unsigned char RunF;
  58. unsigned char WaitF;

  59. unsigned char SwF;

  60. /**
  61.   ***************************************************************
  62.   * @brief Configures GPIOs
  63.   * @par Parameters: None
  64.   * @retval void None
  65.   * @par Required preconditions: None
  66.   ***************************************************************
  67.   */
  68. void GPIO_Configuration(void)
  69. {
  70.   /* GPIOD reset */
  71.         GPIO_DeInit(LED_GPIO_PORT);
  72.         GPIO_DeInit(LED_GPIO_PORT2);
  73.         GPIO_DeInit(KEY_GPIO_PORT);
  74.         
  75.         GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS,GPIO_MODE_OUT_PP_LOW_FAST);
  76.         GPIO_Init(LED_GPIO_PORT2, (GPIO_Pin_TypeDef)LED_GPIO_PINS2,GPIO_MODE_OUT_PP_LOW_FAST);        
  77.          GPIO_Init(LED_GPIO_PORT3, (GPIO_Pin_TypeDef)LED_GPIO_PINS3,GPIO_MODE_OUT_PP_LOW_FAST);        
  78.         
  79.          GPIO_Init(KEY_GPIO_PORT, (GPIO_Pin_TypeDef)KEY_GPIO_PINS,GPIO_MODE_IN_PU_NO_IT);
  80.         GPIO_Init(KEY_GPIO_PORT, (GPIO_Pin_TypeDef)KEY_TRIGGER_PINS,GPIO_MODE_IN_PU_NO_IT);
  81.   GPIO_Init(KEY_GPIO_PORT, (GPIO_Pin_TypeDef)KEY_MODE_PINS,GPIO_MODE_IN_PU_NO_IT);
  82.   GPIO_Init(KEY_GPIO_PORT2, (GPIO_Pin_TypeDef)KEY_SW_PINS,GPIO_MODE_IN_PU_NO_IT);
  83.         
  84. }

  85. /**
  86.   *****************************************************************
  87.   * @brief  Configure TIM4 to generate an update interrupt each 1ms
  88.   * @param  None
  89.   * @retval None
  90.  *****************************************************************
  91.   */
  92. static void TIM4_Config(void)
  93. {
  94.   /* TIM4 configuration:
  95.    - TIM4CLK is set to 16 MHz, the TIM4 Prescaler is equal to 128 so the TIM1 counter
  96.    clock used is 16 MHz / 128 = 125 000 Hz
  97.   - With 125 000 Hz we can generate time base:
  98.       max time base is 2.048 ms if TIM4_PERIOD = 255 --> (255 + 1) / 125000 = 2.048 ms
  99.       min time base is 0.016 ms if TIM4_PERIOD = 1   --> (  1 + 1) / 125000 = 0.016 ms
  100.   - In this example we need to generate a time base equal to 1 ms
  101.    so TIM4_PERIOD = (0.001 * 125000 - 1) = 124 */

  102.   /* Time base configuration */
  103.   TIM4_TimeBaseInit(TIM4_PRESCALER_128, TIM4_PERIOD);
  104.   /* Clear TIM4 update flag */
  105.   TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  106.   /* Enable update interrupt */
  107.   TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);

  108.   /* Enable TIM4 */
  109.   TIM4_Cmd(ENABLE);
  110. }

  111. /**
  112.   ********************************************************
  113.   * @brief  Decrements the TimingDelay variable.
  114.   * @param  None
  115.   * @retval None
  116.  ********************************************************
  117.   */
  118. void TimingDelay_Decrement(void)
  119. {
  120.   if (TimingDelay != 0x00) { TimingDelay--; }
  121.         if (BlinkDelay != 0x00)        {        BlinkDelay--;        }
  122.   if (SaveDelay != 0x00) { SaveDelay--;}
  123. }

  124. /*******************************
  125.           task0
  126. *******************************/
  127. void task0(void)
  128. {
  129.         _BEGIN
  130.         while(1)
  131.         {
  132.         WaitX(100);
  133.         GPIO_WriteHigh(LED_GPIO_PORT, SW_4);
  134.         WaitX(200);
  135.         GPIO_WriteLow(LED_GPIO_PORT, SW_4);
  136.         }
  137.         _END
  138. }

  139. /*******************************
  140.           task1
  141. *******************************/
  142. void  task1(void)
  143. {
  144.     _BEGIN
  145.     while(1)
  146.     {
  147.         GPIO_WriteHigh(LED_GPIO_PORT, SW_5);
  148.         WaitX(50);
  149.         GPIO_WriteLow(LED_GPIO_PORT, SW_5);
  150.         WaitX(50);
  151.     }
  152.     _END
  153. }

  154. /**
  155.   ****************************************************************
  156.   * @brief Main function.
  157.   * @par Parameters: None
  158.   * @retval void None
  159.   * @par Required preconditions: None
  160.   ****************************************************************
  161.   */
  162. int main(void)
  163. {
  164.   /* Configures clocks  Fmaster = 16MHz */
  165.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

  166.   /* Configures GPIOs */
  167.   GPIO_Configuration();

  168.   /* TIM4 configuration */
  169.   TIM4_Config();

  170.   /* enable interrupts */
  171.   enableInterrupts();

  172.   while(1)
  173.     {
  174.         RunTask(task0,Task0_ID);
  175.         RunTask(task1,Task1_ID);
  176.     }
  177. }


复制代码
holts1 回答时间:2015-1-14 08:00:15
以下是中断代码


  1. /**
  2.   ******************************************************************************
  3.   * @file     stm8s_it.c
  4.   * @author   MCD Application Team
  5.   * @version  V2.1.0
  6.   * @date     18-November-2011
  7.   * @brief    Main Interrupt Service Routines.
  8.   *           This file provides template for all peripherals interrupt service
  9.   *           routine.
  10.   ******************************************************************************
  11.   * @attention
  12.   *
  13.   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  14.   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  15.   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  16.   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  17.   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  18.   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  19.   *
  20.   * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  21.   ******************************************************************************
  22.   */

  23. /* Includes ------------------------------------------------------------------*/
  24. #include "stm8s_it.h"

  25. /** @addtogroup Template_Project
  26.   * @{
  27.   */

  28. /* Private typedef -----------------------------------------------------------*/
  29. /* Private define ------------------------------------------------------------*/
  30. /* Private macro -------------------------------------------------------------*/
  31. /* Private variables ---------------------------------------------------------*/
  32. /* Private function prototypes -----------------------------------------------*/
  33. extern void TimingDelay_Decrement(void);
  34. //extern volatile unsigned char timers[MAXTASKS];
  35. /* Private functions ---------------------------------------------------------*/
  36. /* Public functions ----------------------------------------------------------*/

  37. #ifdef _COSMIC_
  38. /**
  39.   * @brief Dummy Interrupt routine
  40.   * @par Parameters:
  41.   * None
  42.   * @retval
  43.   * None
  44. */
  45. INTERRUPT_HANDLER(NonHandledInterrupt, 25)
  46. {
  47.   /* In order to detect unexpected events during development,
  48.      it is recommended to set a breakpoint on the following instruction.
  49.   */
  50. }
  51. #endif /*_COSMIC_*/

  52. /**
  53.   * @brief TRAP Interrupt routine
  54.   * @param  None
  55.   * @retval None
  56.   */
  57. INTERRUPT_HANDLER_TRAP(TRAP_IRQHandler)
  58. {
  59.   /* In order to detect unexpected events during development,
  60.      it is recommended to set a breakpoint on the following instruction.
  61.   */
  62. }

  63. /**
  64.   * @brief Top Level Interrupt routine.
  65.   * @param  None
  66.   * @retval None
  67.   */
  68. INTERRUPT_HANDLER(TLI_IRQHandler, 0)

  69. {
  70.   /* In order to detect unexpected events during development,
  71.      it is recommended to set a breakpoint on the following instruction.
  72.   */
  73. }

  74. /**
  75.   * @brief Auto Wake Up Interrupt routine.
  76.   * @param  None
  77.   * @retval None
  78.   */
  79. INTERRUPT_HANDLER(AWU_IRQHandler, 1)
  80. {
  81.   /* In order to detect unexpected events during development,
  82.      it is recommended to set a breakpoint on the following instruction.
  83.   */
  84. }

  85. /**
  86.   * @brief Clock Controller Interrupt routine.
  87.   * @param  None
  88.   * @retval None
  89.   */
  90. INTERRUPT_HANDLER(CLK_IRQHandler, 2)
  91. {
  92.   /* In order to detect unexpected events during development,
  93.      it is recommended to set a breakpoint on the following instruction.
  94.   */
  95. }

  96. /**
  97.   * @brief External Interrupt PORTA Interrupt routine.
  98.   * @param  None
  99.   * @retval None
  100.   */
  101. INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3)
  102. {
  103.   /* In order to detect unexpected events during development,
  104.      it is recommended to set a breakpoint on the following instruction.
  105.   */
  106. }

  107. /**
  108.   * @brief External Interrupt PORTB Interrupt routine.
  109.   * @param  None
  110.   * @retval None
  111.   */
  112. INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4)
  113. {
  114.   /* In order to detect unexpected events during development,
  115.      it is recommended to set a breakpoint on the following instruction.
  116.   */
  117. }

  118. /**
  119.   * @brief External Interrupt PORTC Interrupt routine.
  120.   * @param  None
  121.   * @retval None
  122.   */
  123. INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5)
  124. {
  125.   /* In order to detect unexpected events during development,
  126.      it is recommended to set a breakpoint on the following instruction.
  127.   */
  128. }

  129. /**
  130.   * @brief External Interrupt PORTD Interrupt routine.
  131.   * @param  None
  132.   * @retval None
  133.   */
  134. INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
  135. {
  136.   /* In order to detect unexpected events during development,
  137.      it is recommended to set a breakpoint on the following instruction.
  138.   */
  139. }

  140. /**
  141.   * @brief External Interrupt PORTE Interrupt routine.
  142.   * @param  None
  143.   * @retval None
  144.   */
  145. INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7)
  146. {
  147.   /* In order to detect unexpected events during development,
  148.      it is recommended to set a breakpoint on the following instruction.
  149.   */
  150. }

  151. #ifdef STM8S903
  152. /**
  153.   * @brief External Interrupt PORTF Interrupt routine.
  154.   * @param  None
  155.   * @retval None
  156.   */
  157. INTERRUPT_HANDLER(EXTI_PORTF_IRQHandler, 8)
  158. {
  159.   /* In order to detect unexpected events during development,
  160.      it is recommended to set a breakpoint on the following instruction.
  161.   */

复制代码
holts1 回答时间:2015-1-13 19:12:35
本帖最后由 holts1 于 2015-1-13 19:13 编辑
那片清茶 发表于 2015-1-13 17:53
你的程序,没有贴全吧。

还有头文件部份


  1. #ifndef PTASK_H
  2. #define PTASK_H

  3. #define MAXTASKS 3

  4. //volatile unsigned char timers[MAXTASKS];

  5. // task constant define
  6. #define Task0_ID      0
  7. #define Task1_ID      1
  8. #define Task2_ID      2
  9. #define Task3_ID      3
  10. #define Task4_ID      4
  11. #define Task5_ID      5
  12. #define Task6_ID      6
  13. #define Task7_ID      7
  14. #define Task8_ID      8

  15. #define _BEGIN static unsigned char _lc; switch(_lc){default:
  16. #define _END ;}; _lc=0; return 255;
  17. #define WaitX(tickets)  do {_lc=__LINE__; return tickets ;} while(0); case __LINE__:

  18. #define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) timers[TaskID]=TaskName(); }  while(0);
  19. #define RunTaskA(TaskName,TaskID) { if (timers[TaskID]==0) {timers[TaskID]=TaskName(); continue;} }   //前面的任务优先保证执行

  20. #define CallSub(SubTaskName) do {unsigned char currdt; _lc=__LINE__; return 0; case __LINE__:  currdt=SubTaskName(); if(currdt!=255) return currdt;} while(0);

  21. #define UpdateTimers() {unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=255)) timers[i-1]--;}}

  22. #define SEM unsigned int
  23. //初始化信号量
  24. #define InitSem(sem) sem=0;
  25. //等待信号量
  26. #define WaitSem(sem) do{ sem=1; WaitX(0); if (sem>0) return 1;} while(0);
  27. //等待信号量或定时器溢出, 定时器tickets 最大为0xFFFE
  28. #define WaitSemX(sem,tickets)  do { sem=tickets+1; WaitX(0); if(sem>1){ sem--;  return 1;} } while(0);
  29. //发送信号量
  30. #define SendSem(sem)  do {sem=0;} while(0);

  31. #endif


复制代码

jeromeRo 回答时间:2015-1-13 14:05:52
裸奔的,到现在我还是二货,只会裸奔
那片清茶 回答时间:2015-1-13 17:53:23
你的程序,没有贴全吧。
我是东哥 回答时间:2015-1-14 14:43:48
这里的协同式操作系统应该说是协同库吧,如果不是楼主自创,应该是参照的protothreads,可以参照这个网站http://dunkels.com/adam/pt。在ANSI C的情况下利用的switch case实现的,很巧妙,可以学习一下。
holts1 回答时间:2015-1-14 19:03:48
我是东哥 发表于 2015-1-14 14:43
这里的协同式操作系统应该说是协同库吧,如果不是楼主自创,应该是参照的protothreads,可以参照这个网站ht ...

不是我自创,是移值高手的, 的确是参照protothreads,  我认为它是个操作系统,一个近似于裸奔的操作系统
MouseCat 回答时间:2015-2-14 10:15:33
文字讲解一下哈
holts1 回答时间:2015-2-17 13:19:57

先看懂代码
holts1 回答时间:2015-2-17 13:20:23
这才是关键
wyxy163@126.com 回答时间:2015-2-19 22:02:42
提示: 作者被禁止或删除 内容自动屏蔽
holts1 回答时间:2015-3-5 13:03:51
提提意见 ?
MouseCat 回答时间:2015-3-6 11:38:49
简述下主要思想啊,关键点是任务是怎么样调度的
anny 回答时间:2015-3-17 08:21:49
太长了。。。。。
123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版