王锦平 发表于 2024-9-5 08:20:21

ethantlh 发表于 2024-9-4 23:07
今天使用STC32G的时候,发现自己创建的任务不会被启动,不知道什么原因。我尝试了放在TEXT的启动StartHOOK ...
怎的你移植了以后也无法启动任务{:4_167:}

ethantlh 发表于 2024-9-5 08:43:42

王锦平 发表于 2024-9-5 08:20
怎的你移植了以后也无法启动任务

对,还找了半天原因,确实没找到。

CosyOS 发表于 2024-9-5 23:29:14

本帖最后由 CosyOS 于 2024-9-5 23:33 编辑

ethantlh 发表于 2024-9-4 23:07
今天使用STC32G的时候,发现自己创建的任务不会被启动,不知道什么原因。我尝试了放在TEXT的启动StartHOOK ...
1、新增任务时,应注意 syscfg.h -> 任务设置,“用户任务总数”、“任务名称最大长度” 等参数。

2、应时常关注 系统配置 和 MCU配置,并做出适当调整。

你这次,有两个问题需要解决:
1、task3、LedShow_Task,任务栈太小了,因为当前是PSP模式,你可先设置大一些,以后再减小。
如:
uCreateTask(Task3,2,192,0,0);
uCreateTask(LedShow_Task,3,192,0,0);
2、LedShow_Task 名称有点长,可以短一些,或重新设置 “任务名称最大长度”。






CosyOS 发表于 2024-9-5 23:33:12

王锦平 发表于 2024-9-3 20:45
可以确认的是,设置 IO mode 可以取得预期效果,但设置 IO level 没有取得预期效果。

在此恳求楼主大大 ...

我已测试,分别在 task_2 和 start_hook 中 设置IO P33 = 0; P00 = 1;
P33的LED都能点亮。

王锦平 发表于 2024-9-6 05:08:04

CosyOS 发表于 2024-9-5 23:33
我已测试,分别在 task_2 和 start_hook 中 设置IO P33 = 0; P00 = 1;
P33的LED都能点亮。
...

我这里确实是没有将IO操作成功
原理图是这样的 https://github.com/PING020903/led12x12x4/tree/main

如图,现在效果是这样的。
当前代码是这样的
/**************************************************************************//**
* @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


uCreateTask(task_2, 1, TEST_TASKSTACKSIZE, 0, 0)
{
        static unsigned int i = 0;
        //uDelay_s(5);

        P33 = 1;
        P00 = 0;
        printf("task_2: %u\r\n", ++i);
        uEndTasking;
}

void set_IO(void)
{
    P33 = 0;
    P00 = 1;
}
void start_hook(void)
{
    set_IO();
    uStartTask_Ready(task_2);                                // 启动用户任务

   
    printf("start_hook\r\n");
   
}

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
        set_IO();
        uStartTask(Starter, OS_STATUS_READY);        // 启动任务
        uStartTask(Sysidle, OS_STATUS_READY);        // 空闲任务
        // 启动空闲任务后不会返回

        while(true);
}
如果正常进入了任务的话,那么亮起的LED都不会亮起

ethantlh 发表于 2024-9-6 08:43:16

CosyOS 发表于 2024-9-5 23:29
1、新增任务时,应注意 syscfg.h -> 任务设置,“用户任务总数”、“任务名称最大长度” 等参数。

2、应 ...

感谢大佬!

CosyOS 发表于 2024-9-7 01:38:07

本帖最后由 CosyOS 于 2024-9-7 01:41 编辑

王锦平 发表于 2024-9-6 05:08
我这里确实是没有将IO操作成功
原理图是这样的 https://github.com/PING020903/led12x12x4/tree/main


我看了你的图纸,
LED共24行、24列;
24行,分别为 P1~P24;
24列,分别为 P1~P24,并用 P0 替换 同名行;
如果 行为高电平,列为低电平,对应LED点亮。

如果 P33 = 0; P00 = 1; 也就是 “P0” = 0;“P1” = 1;=> D1 点亮;
如果 P33 = 1; P00 = 0; 也就是 “P0” = 1;“P1” = 0;=> 此时由于 “P0” 未做为行,所以 task_2 中不会有LED点亮。

不知是否是由于你的疏忽,task_2 中写错了 0 or 1?

王锦平 发表于 2024-9-7 03:36:06

本帖最后由 王锦平 于 2024-9-7 03:43 编辑

CosyOS 发表于 2024-9-7 01:38
我看了你的图纸,
LED共24行、24列;
24行,分别为 P1~P24;

并不是我疏忽,而是我尝试想要在 task_2 中关闭LED,如我上贴中的照片所示,实际效果是LED仍然亮起{:4_184:}
正常来说,LED确实应该只会闪一下就不亮起了,故此我一直说没有正常进入任务

ethantlh 发表于 2024-9-7 10:29:12

本帖最后由 ethantlh 于 2024-9-7 10:32 编辑

今天使用库函数的时候发现CosyOS例程里的库函数可能因为比较早的缘故,里面PWM部分的PWMx_BKR写成了PWMx_BRK,例程里的STC32G.H文件中也同样为PWMx_BRK。但是最新的数据手册和头文件都是PWMx_BKR。如果有需要的话,可以下载最新的库函数,将PWM部分的三个文件替换,并修改#include "typedef.h"为CosyOS的#include "CosyOS.H"。下载最新的STC32G.H替换头文件。最新的STC32G.H头文件下面要将CosyOS原STC32G.H头文件最下面的补充部分添加进来。
//===================================================

#define      Priority_0                        0      //中断优先级为 0 级(最低级)
#define      Priority_1                        1      //中断优先级为 1 级(较低级)
#define      Priority_2                        2      //中断优先级为 2 级(较高级)
#define      Priority_3                        3      //中断优先级为 3 级(最高级)

#define ENABLE                1
#define DISABLE                0

#define SUCCESS                0
#define FAIL                -1

CosyOS 发表于 2024-9-8 02:36:56

王锦平 发表于 2024-9-7 03:36
并不是我疏忽,而是我尝试想要在 task_2 中关闭LED,如我上贴中的照片所示,实际效果是LED仍然亮起
正常来 ...

哦,原来是这样,那证明 task_2 确实没有正常运行。
我也看不出问题出在哪里,
建议开启 任务管理器 辅助判断问题出在哪里。

我已用 STC8H8K64U 按照你的方法进行了测试,task_2 可正常运行、LED也正常。









建议你把 任务管理器、printf 都配置好,辅助判断问题出在哪里。
总之,你要相信 CosyOS 是不存在这种低级的问题的,
当前 已有很多朋友都在使用 CosyOS,并应用在实际产品中。
出了问题,就要采用一些方法找出问题出在哪里。
我手中没有和你一样的板子,无法做出和你完全相同的测试,所以还得靠你自己了。
建议你没必要保留 STC8H 的代码,直接替换为 STC8C 的代码即可,并删除没用的test任务等。
task_2 中做一个delay,每运行一次都 printf("task_2: %u\r\n", ++i); 这样很好啊,可以看出 task_2 运行了几次?
先把注意力集中在 task_2 是否运行,运行了几次上,不要只盯着 LED。
如果 task_2 运行了,LED不正常再找LED的原因;
如果 task_2 未运行,就找 task_2 不能运行的原因。
我的测试结论就是 task_2 可以正常运行,你就要靠你自己了,毕竟 板子不同,头文件不同,相关的代码也有差异。

下面是我的最新测试方法:


task_2 每一秒钟运行一次,IO取反,这样LED 会亮一秒、灭一秒闪烁,可正常亮灭。


task_2已经运行1000多次了,没有问题。

页: 79 80 81 82 83 84 85 86 87 88 [89] 90 91 92 93 94 95 96 97 98
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板