- /**************************************************************************//**
- * @item CosyOS-II Kernel
- * @file os_main.c
- * @brief 主函数
- * @author 迟凯峰
- * @version V3.0.0
- * @date 2024.06.25
- ******************************************************************************/
-
- #include "os_link.h"
- #include "stdio.h"
- #define TEST_TASKSTACKSIZE 64
- #define IO_M0_RESET (unsigned char)(0x00)
- #define IO_M1_RESET (unsigned char)(0x00)
-
- /// @brief 设置推挽输出
- /// @param port 端口
- /// @param pin 引脚
- void GPIO_setPushPullupOutput(const unsigned char port, const unsigned char pin)
- {
- unsigned char fr_M0 = IO_M0_RESET;
- unsigned char fr_M1 = IO_M1_RESET;
- if ( port > 5 || pin > 7 )
- return;
-
- switch ( port ) // 根据 port读取不同的寄存器
- {
- case 0:
- fr_M0 = P0M0;
- fr_M1 = P0M1;
- break;
- case 1:
- fr_M0 = P1M0;
- fr_M1 = P1M1;
- break;
- case 2:
- fr_M0 = P2M0;
- fr_M1 = P2M1;
- break;
- case 3:
- fr_M0 = P3M0;
- fr_M1 = P3M1;
- break;
- case 4:
- fr_M0 = P4M0;
- fr_M1 = P4M1;
- break;
- case 5:
- fr_M0 = P5M0;
- fr_M1 = P5M1;
- break;
- default:
- return;
- }
- BIT_SET_ONE(fr_M0, pin);
- BIT_SET_ZERO(fr_M1, pin);
-
- switch ( port ) // 根据 port读取不同的寄存器
- {
- case 0:
- P0M0 = fr_M0;
- P0M1 = fr_M1;
- break;
- case 1:
- P1M0 = fr_M0;
- P1M1 = fr_M1;
- break;
- case 2:
- P2M0 = fr_M0;
- P2M1 = fr_M1;
- break;
- case 3:
- P3M0 = fr_M0;
- P3M1 = fr_M1;
- break;
- case 4:
- P4M0 = fr_M0;
- P4M1 = fr_M1;
- break;
- case 5:
- P5M0 = fr_M0;
- P5M1 = fr_M1;
- break;
- default:
- return;
- }
- return;
- }
-
- /// @brief 设置开漏输出
- /// @param port 端口
- /// @param pin 引脚
- void GPIO_setOpenDrainOutput(const unsigned char port, const unsigned char pin)
- {
- unsigned char fr_M0 = IO_M0_RESET;
- unsigned char fr_M1 = IO_M1_RESET;
- if ( port > 5 || pin > 7 )
- return;
-
- switch ( port ) // 根据 port读取不同的寄存器
- {
- case 0:
- fr_M0 = P0M0;
- fr_M1 = P0M1;
- break;
- case 1:
- fr_M0 = P1M0;
- fr_M1 = P1M1;
- break;
- case 2:
- fr_M0 = P2M0;
- fr_M1 = P2M1;
- break;
- case 3:
- fr_M0 = P3M0;
- fr_M1 = P3M1;
- break;
- case 4:
- fr_M0 = P4M0;
- fr_M1 = P4M1;
- break;
- case 5:
- fr_M0 = P5M0;
- fr_M1 = P5M1;
- break;
- default:
- return;
- }
- BIT_SET_ONE(fr_M0, pin);
- BIT_SET_ONE(fr_M1, pin);
-
- switch ( port ) // 根据 port读取不同的寄存器
- {
- case 0:
- P0M0 = fr_M0;
- P0M1 = fr_M1;
- break;
- case 1:
- P1M0 = fr_M0;
- P1M1 = fr_M1;
- break;
- case 2:
- P2M0 = fr_M0;
- P2M1 = fr_M1;
- break;
- case 3:
- P3M0 = fr_M0;
- P3M1 = fr_M1;
- break;
- case 4:
- P4M0 = fr_M0;
- P4M1 = fr_M1;
- break;
- case 5:
- P5M0 = fr_M0;
- P5M1 = fr_M1;
- break;
- default:
- return;
- }
- return;
- }
-
- uCreateTask(task_2, 1, TEST_TASKSTACKSIZE, 0, 0)
- {
- static unsigned int i = 0;
- //uDelay_s(5);
-
- P33 = 0;
- P00 = 1;
- printf("task_2: %u\r\n", ++i);
- uEndTasking;
- }
-
- void set_IO(void)
- {
- P33 = 0;
- P00 = 1;
- }
- void start_hook(void)
- {
- uStartTask_Ready(task_2); // 启动用户任务
-
- GPIO_setOpenDrainOutput(3, 3);// P0
- GPIO_setPushPullupOutput(0,0);
- printf("start_hook\r\n");
- set_IO();
- }
-
- int main(void)
- {
- void s_init_timing(void);
- #if SYSCFG_SAFERUNTIME == __ENABLED__
- s_tid_t i;
- for(i = 0; i < OS_TASKTOTAL + 1; i++){
- s_sign_timeout[i] = 0;
- }
- #endif
- #if OS_TIMINTTOTAL || OS_TIMQRYTOTAL
- s_init_timing();
- #endif
- init_hook();
- printf("init hook ok\r\n");
- mSys_INIT;
- printf("init syscfg ok\r\n");
-
-
-
- #if SYSCFG_DEBUGGING == __ENABLED__
- sStartTask_TimQry(OS_TMID_TASKMGR);
- #endif
-
- uStartTask(Starter, OS_STATUS_READY); // 启动任务
- uStartTask(Sysidle, OS_STATUS_READY); // 空闲任务
- // 启动空闲任务后不会返回
-
- while(true);
- }
复制代码
目前就这套测试代码,是根据你的STC8H的工程修改的
观测以下结果:
1、没有进入任务
2、启动 Sysidle 以后它没有返回,在 uStartTask(Sysidle, OS_STATUS_READY); 这句以后的代码都不会跑
3、start_hook() 内我修改 IO 模式是成功的,但是设置 IO_level 是不成功的
|