CosyOS
发表于 2024-8-30 21:26:26
王锦平 发表于 2024-8-22 11:28
楼主有没有什么readme文件配合阅读,看不懂你这个宏定义对应的都是什么参数
task 是任务这个看懂
暂时先用这个吧,以后会出新版,合为一个说明文档。
CosyOS
发表于 2024-8-30 21:35:27
王锦平 发表于 2024-8-22 12:55
问,工程里面用了两个串口,UART1和UART2分别是用来做什么的。若是UART2是用来debug OS的那为什么不用UART1 ...
UART1 用做 用户的 printf,
UART2 用做 系统的 Taskmgr,
原因不多解释,总之分开好。
王锦平
发表于 2024-9-1 18:08:51
本帖最后由 王锦平 于 2024-9-1 18:20 编辑
CosyOS 发表于 2024-8-30 21:17
启动你自己的任务,不要在 main()中,而是在 启动钩子 start_hook()中,
这样就会一切正常了。
你可以看一 ...
情况是这样的
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 start_hook(void)
{
uStartTask_Ready(task_2); // 启动用户任务
GPIO_setOpenDrainOutput(3, 3);// P0
GPIO_setPushPullupOutput(0,0);
printf("start_hook\r\n");
P33 = 0;
P00 = 1;
}
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 = 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);
}
除了在 main() 里头以外,这两个函数里头我操作 IO_level 都没有成功,但是可以确定的是,在 start_hook() 里面操作 IO 模式是成功了的,因为在执行了 uStartTask(Starter, OS_STATUS_READY);
这之后我操作了 IO P33 = 0;
P00 = 1;
灯亮了,但是在 start_hook() task_2() 这两个函数里头,操作 IO 都没有成功,因为灯没有亮
我甚至在 idle_hook() 里头也操作了 IO 但也没有成功
CosyOS
发表于 2024-9-1 22:48:54
王锦平 发表于 2024-9-1 18:08
情况是这样的
除了在 main() 里头以外,这两个函数里头我操作 IO_level 都没有成功,但是可以确定的是, ...
会不会 在 task_2 中 点灯时,IO模式没有正确配置?IO模式是不是高阻输入(默认)?
看下测试程序,在各个任务中也经常会有IO输出,都是正常的。
王锦平
发表于 2024-9-2 00:22:36
CosyOS 发表于 2024-9-1 22:48
会不会 在 task_2 中 点灯时,IO模式没有正确配置?IO模式是不是高阻输入(默认)?
看下测试程序,在各 ...
/**************************************************************************//**
* @item CosyOS-II Kernel
* @file os_main.c
* @brief 主函数
* @author 迟凯峰
* @versionV3.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 = 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 是不成功的
ethantlh
发表于 2024-9-2 17:19:35
今天在使用STC32G的cosyOS时遇到一个问题,在PendSV中断配置时,发现除了INT0的中断可以使用,其他的中断都会报这个错误。不知道是什么原因,求大佬解答。
CosyOS
发表于 2024-9-2 19:46:27
ethantlh 发表于 2024-9-2 17:19
今天在使用STC32G的cosyOS时遇到一个问题,在PendSV中断配置时,发现除了INT0的中断可以使用,其他的中断都 ...
你需要在 port_80251s.s 文件中,定义 IE1。
参照 STC32G.H,把 IE1 添加至 "用户定义寄存器" 即可。
STC32G.H中,sbit IE1 = TCON^3;
这里应调整为 IE1 BIT TCON^3
替换掉 行27,或添加至 行28.
CosyOS
发表于 2024-9-2 20:09:43
本帖最后由 CosyOS 于 2024-9-2 20:40 编辑
王锦平 发表于 2024-9-2 00:22
目前就这套测试代码,是根据你的STC8H的工程修改的
观测以下结果:
1、没有进入任务
那我建议你,在 init_hook() 中 设置 IO模式,
而后再分别在 start_hook、task_2 中 设置IO,看能否正常。
启动 Sysidle 后,就是不会返回 main 的,而是直接开始任务调度,就是这样设计的,这不是bug。
如果还是 不行,你可以发给我,我来查找原因。
我怀疑可能 设置IO模式 并未取得预期的效果。
你可以先用原始且简单的方式 设置一下 IO模式,试一试,如:
P0M0 = 0; P0M1 = 0;
P1M0 = 0; P1M1 = 0;
。。。
先所有IO都为准双向口试一试。
王锦平
发表于 2024-9-3 20:45:58
CosyOS 发表于 2024-9-2 20:09
那我建议你,在 init_hook() 中 设置 IO模式,
而后再分别在 start_hook、task_2 中 设置IO,看能否正常。 ...
可以确认的是,设置 IO mode 可以取得预期效果,但设置 IO level 没有取得预期效果。
在此恳求楼主大大替我排查一下{:4_201:}
这几个文件有动过
* syscfg.h
* init_hook.c
* Taskmgr.c
* os_link.h
ethantlh
发表于 2024-9-4 23:07:34
本帖最后由 ethantlh 于 2024-9-5 11:51 编辑
今天使用STC32G的时候,发现自己创建的任务不会被启动,不知道什么原因。我尝试了放在TEXT的启动StartHOOK里,发现无法启动(但是模板自带的2个TASK都可以启动);放在StartHOOK.C的StartHOOK里也无法启动,不知道是什么原因。求大佬解答。