在完成【 Embedded_Studio + Mark3 RTOS + STM32F10X移植初测 】的前提下,在STM32板子上可以玩玩例程,试着了解一下Mark3,
也加入了一点个人的想法,最终测试mian.cpp如下:
/*=========================================================================== Copyright (c) 2012 - 2019 m0slevin, all rights reserved. See license.txt for more information ===========================================================================*/ #include "mark3.h" using namespace Mark3; // 可见OS内核命名空间 extern "C" { void __cxa_pure_virtual(void) {} void DebugPrint(const char* szString_); } namespace // 类的命名空间,名字可以不写 { Thread clAppThread; // 任务创建一个线程对象 Thread clIdleThread;
K_WORD awAppStack[PORT_KERNEL_DEFAULT_STACK_SIZE]; // 为每个线程分配堆栈,默认值 K_WORD awIdleStack[PORT_KERNEL_DEFAULT_STACK_SIZE]; //void AppMain(void* unused_); // 每个线程定义入口函数申明 //void IdleMain(void* unused_); //void Thread_start(void* unused_); // 线程初始后,加入调度器,简化main函数 //--------------------------------------------------------------------------- void AppMain(void* unused_) // AppMain入口函数定义 { while (1) { Thread::Sleep(1000); } } //--------------------------------------------------------------------------- void IdleMain(void* unused_) // IdleMain入口函数定义 { while (1); // 空闲任务,一搬是些低功耗操作 } } // anonymous namespace //--------------------------------------------------------------------------- void Thread_start(void) // 线程初始后,加入调度器 { clAppThread.Init( awAppStack, // 指向堆栈的指针 sizeof(awAppStack), // 堆栈的大小 1, // 线程优先级 AppMain, // 入口函数 nullptr ); // 入口函数参数 clIdleThread.Init(awIdleStack, sizeof(awIdleStack), 0, IdleMain, 0); clAppThread.Start(); // 将线程添加到调度程序 clIdleThread.Start(); } //--------------------------------------------------------------------------- int main(void) { Kernel::Init(); // 内核初始化 Thread_start(); // 线程初始后,加入调度器 Kernel::Start(); // 将系统控制权交给内核 return 0; }
大概流程: 用户先实现对应的线程,然后初始化内核,压入用户线程,开启内核调度器。
---- END ----