You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

88 regels
3.7 KiB

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. /*定义信号量*/
  4. OS_EVENT* ModbusReceived; /*接收到modbus请求报文*/
  5. OS_EVENT* ModbusAssembled; /*modbus响应帧组装完成*/
  6. /*定义任务栈*/
  7. static OS_STK AppTaskStartStk[APP_TASK_START_STK_SIZE];
  8. static OS_STK AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE];
  9. static OS_STK AppTaskModbusSendStk[APP_TASK_MODBUS_SEND_STK_SIZE];
  10. /*定义任务主体函数*/
  11. void AppTaskStart (void *p_arg);
  12. void AppTaskModbusParse (void *p_arg);
  13. void AppTaskModbusSend (void *p_arg);
  14. int main()
  15. {
  16. Sys_Config(); /* stm32系统初始化配置 */
  17. ModbusHardwareInit();
  18. OSInit(); /* uCOS系统初始化 */
  19. /*创建初始启动任务*/
  20. OSTaskCreateExt(AppTaskStart, /* task:任务入口函数 */
  21. (void *)0, /* p_arg:传给任务的用户参数;不用时传 NULL */
  22. (OS_STK *)&AppTaskStartStk[APP_TASK_START_STK_SIZE - 1], /* ptos:向低地址增长时的初始栈顶,使用数组高地址端 */
  23. (INT8U )APP_TASK_START_PRIO, /* prio:唯一优先级,也是 II 管理任务时最常用的标识 */
  24. (INT16U )APP_TASK_START_PRIO, /* id:用户任务编号;不参与调度,一般与任务优先级相同 */
  25. (OS_STK *)&AppTaskStartStk[0], /* pbos:栈底;栈检查从此处识别未使用区域 */
  26. (INT32U )APP_TASK_START_STK_SIZE, /* stk_size:OS_STK 元素个数,不是字节数。总大小为OS_STK大小(1/2/4字节) * 任务堆栈大小 */
  27. (void *)0, /* pext:用户 TCB 扩展区指针;不用时传 NULL */
  28. (INT16U )(OS_TASK_OPT_STK_CHK /* opt:允许栈使用量检查 */
  29. | OS_TASK_OPT_STK_CLR)); /* 创建时清零栈,为检查提供已知填充值 */
  30. OSStart(); /*启动操作系统,开始系统调度*/
  31. }
  32. /*初始启动任务*/
  33. void AppTaskStart(void *p_arg)
  34. {
  35. OS_CPU_SR cpu_sr; /*关中断前必须进行的操作*/
  36. (void)p_arg; /*防止编译器警告*/
  37. OS_CPU_SysTickInit(); /*配置滴答定时器*/
  38. OS_ENTER_CRITICAL(); /* 关中断 */
  39. /*创建信号量*/
  40. ModbusReceived = OSSemCreate(0);
  41. ModbusAssembled = OSSemCreate(0);
  42. /* 创建modbus协议帧解析任务 */
  43. OSTaskCreateExt(AppTaskModbusParse,
  44. (void *)0,
  45. (OS_STK *)&AppTaskModbusParseStk[APP_TASK_MODBUS_PARSE_STK_SIZE - 1],
  46. (INT8U )APP_TASK_MODBUS_PARSE_PRIO,
  47. (INT16U )APP_TASK_MODBUS_PARSE_PRIO,
  48. (OS_STK *)&AppTaskModbusParseStk[0],
  49. (INT32U )APP_TASK_MODBUS_PARSE_STK_SIZE,
  50. (void *)0,
  51. (INT16U )(OS_TASK_OPT_STK_CHK
  52. | OS_TASK_OPT_STK_CLR));
  53. /* 创建modbus响应帧发送任务 */
  54. OSTaskCreateExt(AppTaskModbusSend,
  55. (void *)0,
  56. (OS_STK *)&AppTaskModbusSendStk[APP_TASK_MODBUS_SEND_STK_SIZE - 1],
  57. (INT8U )APP_TASK_MODBUS_SEND_PRIO,
  58. (INT16U )APP_TASK_MODBUS_SEND_PRIO,
  59. (OS_STK *)&AppTaskModbusSendStk[0],
  60. (INT32U )APP_TASK_MODBUS_SEND_STK_SIZE,
  61. (void *)0,
  62. (INT16U )(OS_TASK_OPT_STK_CHK
  63. | OS_TASK_OPT_STK_CLR));
  64. OSTaskDel(OS_PRIO_SELF); /* 删除启动任务自身 */
  65. OS_EXIT_CRITICAL(); /* 关中断 */
  66. }