SmartOS/Kernel/Sys.h

236 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _Sys_H_
#define _Sys_H_
#include <stdint.h>
#include <stdio.h>
#include <stddef.h>
#include "Core\Type.h"
#include "Core\Buffer.h"
#include "Core\Array.h"
#include "Core\ByteArray.h"
#include "Core\SString.h"
#include "Core\Stream.h"
#include "Core\DateTime.h"
#include "Core\Version.h"
#include "Core\List.h"
#include "Core\Dictionary.h"
#include "Core\Delegate.h"
/* 引脚定义 */
#include "Platform\Pin.h"
// 强迫内联
#define _force_inline __attribute__( ( always_inline ) ) __INLINE
extern "C"
{
#if defined(DEBUG)
#define debug_printf SmartOS_printf
extern int SmartOS_printf(const char *format, ...);
#else
#define debug_printf(format, ...)
#endif
}
#ifdef DEBUG
void assert_failed2(cstring msg, cstring file, unsigned int line);
#define assert(expr, msg) ((expr) ? (void)0 : assert_failed2(msg, (const char*)__FILE__, __LINE__))
#else
#define assert(expr, msg) ((void)0)
#endif
// 关键性代码放到开头
#if !defined(TINY) && defined(USEROOT)
#define INROOT __attribute__((section(".InRoot")))
#else
#define INROOT
#endif
#if defined(BOOT) || defined(APP)
struct HandlerRemap
{
Func pUserHandler;
void* Reserved1;
void* Reserved2;
void* Reserved3;
};
extern struct HandlerRemap StrBoot;
#endif
class SystemConfig;
// 系统类
class TSys
{
public:
byte MessagePort;// 消息口默认0表示USART1
uint Clock; // 系统时钟
uint CystalClock;// 晶振时钟
cstring Name; // 系统名称
cstring Company; // 系统厂商
ushort Code; // 产品代码
ushort Ver; // 系统版本
byte ID[12]; // 芯片ID。
ushort DevID; // MCU编码。低字设备版本高字子版本
ushort RevID; // MCU编码。低字设备版本高字子版本
uint CPUID; // CPUID
ushort FlashSize; // 芯片Flash容量。
ushort RAMSize; // 芯片RAM容量
const SystemConfig* Config; // 系统设置
TSys(); // 构造函数
void InitClock(); // 初始化系统时钟
void Init(); // 初始化系统
void ShowInfo() const;
uint HeapBase() const; // 堆起始地址,前面是静态分配内存
uint StackTop() const; // 栈顶,后面是初始化不清零区域
void SetStackTop(uint addr);
UInt64 Ms() const; // 系统启动后的毫秒数
uint Seconds() const; // 系统绝对当前时间,秒
void Sleep(int ms) const; // 毫秒级延迟
void Delay(int us) const; // 微秒级延迟
typedef void (*FuncI32)(int param);
FuncI32 OnSleep;
bool CheckMemory() const;
// 延迟异步重启
void Reboot(int msDelay = 0) const;
// 系统跟踪
void InitTrace(void* port) const;
void Trace(int times = 1) const;
private:
// 重启系统
void Reset() const;
void OnInit();
void OnShowInfo() const;
void OnStart();
public:
// 创建任务返回任务编号。dueTime首次调度时间msperiod调度间隔ms-1表示仅处理一次
uint AddTask(Action func, void* param, int dueTime = 0, int period = 0, cstring name = nullptr) const;
template<typename T>
uint AddTask(void(T::*func)(), T* target, int dueTime = 0, int period = 0, cstring name = nullptr)
{
return AddTask(*(Action*)&func, target, dueTime, period, name);
}
void RemoveTask(uint& taskid) const;
// 设置任务的开关状态同时运行指定任务最近一次调度的时间0表示马上调度
bool SetTask(uint taskid, bool enable, int msNextTime = -1) const;
// 改变任务周期
bool SetTaskPeriod(uint taskid, int period) const;
bool Started;
void Start(); // 开始系统大循环
};
extern TSys Sys; // 创建一个全局的Sys对象 会在main函数之前执行构造函数
// 系统设置
class SystemConfig
{
public:
// 操作系统
char Name[16]; // 系统名称。如SmartOS-M3-10x
uint Ver; // 系统版本。系统内
// 硬件
uint HardVer; // 硬件版本
// 应用软件
ushort Type; // 产品种类
uint AppVer; // 产品版本
char Serial[16]; // 授权码
char Product[16];// 产品名称
char Company[16];// 公司
char DevID[16]; // 设备编码
char Server[32]; // 服务器。重置后先尝试厂商前端,再尝试原服务器
char Token[32]; // 访问服务器的令牌
uint Expire; // 有效期。1970以来的秒数。
ushort Checksum; // 校验
};
void EnterCritical();
void ExitCritical();
//extern uint32_t __REV(uint32_t value);
//extern uint32_t __REV16(uint16_t value);
uint _REV(uint value);
ushort _REV16(ushort value);
// 智能IRQ初始化时备份销毁时还原
// SmartIRQ相当霸道它直接关闭所有中断再也没有别的任务可以跟当前任务争夺MCU
class SmartIRQ
{
public:
SmartIRQ(bool enable = false);
~SmartIRQ();
private:
uint _state;
};
#if DEBUG
// 函数栈。
// 进入函数时压栈函数名,离开时弹出。便于异常时获取主线程调用列表
class TraceStack
{
public:
TraceStack(cstring name);
~TraceStack();
static void Show();
};
#define TS(name) TraceStack __ts(name)
#else
#define TS(name) ((void)0)
#endif
#endif //_Sys_H_
/*
v3.2.2016.0517 核心类独立到目录Core平台无关系统无关
v3.1.2015.1108 增加系统配置存储模块,增加电源管理模块
v3.0.2015.0806 增强系统调度器,支持无阻塞多任务调度
v2.8.2014.0927 完成微网通讯架构封装消息协议串口及nRF24L01+测试通过
v2.7.2014.0919 支持抢占式多线程调度
v2.6.2014.0823 平台文件独立,接管系统初始化控制权
v2.5.2014.0819 增加堆栈溢出检测模块重载new/delete实现仅Debug有效
v2.4.2014.0811 实现系统多任务调度一次性编译测试通过多任务小灯例程4k
实现以太网精简协议TinyIPARP/ICMP/TCP/UDP混合网络例程7.5k
增加看门狗、定时器模块
v2.3.2014.0806 使用双栈增加稳定性增加RTM优化编译核心函数强制内联自动堆栈越界检查
v2.2.2014.0801 增加引脚保护机制,避免不同模块使用相同引脚导致冲突而难以发现错误
v2.1.2014.0728 增加中断管理模块全面接管中断向量表支持动态修改中断函数支持多中断共用中断函数。F0需配置RAM从0x200000C0开始
v2.0.2014.0725 使用C++全新实现SmartOS支持系统时钟、IO、USART、日志、断言、Spi、NRF24L01、SPIFlash、CAN、Enc28j60GD32超频
v1.3.2014.0624 增加Spi模块和NRF24L01+模块的支持
v1.2.2014.0604 支持GD32芯片
v1.1.2014.0513 支持F0/F1的GPIO和串口功能
v1.0.2014.0506 建立嵌入式系统框架SmartOS使用纯C语言实现
*/