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

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

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

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

举报

38个回答
jeromeRo 回答时间:2015-1-13 14:05:52
裸奔的,到现在我还是二货,只会裸奔
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. }


复制代码
那片清茶 回答时间:2015-1-13 17:53:23
你的程序,没有贴全吧。
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


复制代码

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.   */

复制代码
我是东哥 回答时间: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

先看懂代码
1234下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版