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里也无法启动,不知道是什么原因。求大佬解答。
页: 78 79 80 81 82 83 84 85 86 87 [88] 89 90 91 92 93 94 95 96 97
查看完整版本: 全局不关总中断的 RTOS,CosyOS-III-V1.2.0, 送 擎天柱-AI8051U转89C52核心板