求助TMOS系统最小的调度示例
#define DEBUG 1
#include "CH57x_common.h"
#include "HAL.h"
#include "CH57xBLE_LIB.h"

static tmosTaskID MyTaskID = INVALID_TASK_ID;

__attribute__((section(".highcode")))
void Main_Circulation()
{
  while(1){
    TMOS_SystemProcess( );
  }
}

tmosEvents MyTask_ProcessEvent(tmosTaskID task_id, tmosEvents events) {
    PRINT("MyTask_ProcessEvent invoked \n");
    return 0;
}

int main() {
    bStatus_t s;

    SetSysClock( CLK_SOURCE_PLL_60MHz );

    GPIOA_SetBits( GPIO_Pin_9 );
    GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
    GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
    UART1_DefInit();
    PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );

    HAL_Init();
    MyTaskID = TMOS_ProcessEventRegister(MyTask_ProcessEvent);

//    s = tmos_set_event(MyTaskID, 0U);
    s = tmos_start_task(MyTaskID, 0U, 1U);
    PRINT("s=%x\n", s);
    Main_Circulation();
}

这是我参考蓝牙部分的代码 写的 TMOS 最小的例子, 这里面有几个问题

1. 如果我用 

s = tmos_set_event(MyTaskID, 0U);

则 tmos_set_event 返回是 3, 按头文件的说法应该是不成功,这里不知道为什么, 用 tmos_start_task 返回是 0

2. 

串口中没有打印

Start @ChipID=73
s=0
MyTask_ProcessEvent invoked

串口仅打印


Start @ChipID=73

s=0


这和预期不符, 说明对应的处理函数没有被调度到


我这样写代码是正确的吗? 如果不正确应该怎么写?

写错了。
第一步是要注册任务ID 
image.png
这样返回的是任务ID,每个ID下可以设16个子任务,2字节的变量,每个位可以建立一个独立的子任务,定义见下图
image.png

任务ID和任务标号分配后,就可以启动任务了,下面是立即启动任务,还有延时启动的,具体看LIB.H里面,代码跟踪下,函数有注释。
image.png
任务触发后就可以到指定的函数里面运行了,如下
image.png


image.png

我这里面有注册任务ID呀


你看下,这个函数声明,参数的意思,你的函数参数确认下是不是有问题。

image.png

举例如下

image.png


image.png

这个是从 TMOS 使用说明, EVENT 我看就是一个 UINT16 啊? 第三个参数我写 0 应该是立刻调度?

没想到问题出在哪里


由于 TMOS 的代码部分是黑盒, 发现只要调了 CH57X_BLEInit 就能正常工作, 为啥?



 CH57X_BLEInit 中调用了BLE_LibInit函数,在BLE_LibInit中调用了 TMOS_Init函数

这里包括注册睡眠回掉函数分配ram,初始化状态机.

其中TMOS_Init 函数暂时没有放出来.


tmos 需要先初始化,后面的tmos的相关调度 才会正常



TMOS 代码会开放吗, 现在对着黑盒 debug, 太痛苦了.


用 Debugger 下程序和写入 Flash 启动 OS 部分的行为也有点不大一样, 现在比较迷糊了.


只有登录才能回复,可以选择微信账号登录