标题:
带操作系统的stm32的oled温湿度显示程序
[打印本页]
作者:
herui123456
时间:
2021-11-16 11:44
标题:
带操作系统的stm32的oled温湿度显示程序
实验结果
IMG_20211110_193229.jpg
(2.62 MB, 下载次数: 62)
下载附件
实验效果
2021-11-16 11:39 上传
#ifndef _OS_H_
#define _OS_H_
#include "stm32f10x.h"
#include <stdio.h>
typedef signed char os_i8;
typedef signed short os_i16;
typedef signed int os_i32;
typedef signed long os_i64;
typedef unsigned char os_u8;
typedef unsigned short os_u16;
typedef unsigned int os_u32;
typedef unsigned long os_u64;
typedef os_u32 os_stk;
/*******************************OS参数定义*********************************************/
#define OS_APP_MAX 15 //APP数量(1-255,含1个空闲APP,内存使用为N*(10~12)) bytes)
#define OS_APP_CLOCK 1 //APP时间切片,单位:1ms
#define STK_IDLE_SIZE 18 //空闲APP堆栈长度 (内存使用为N*4) bytes)
#define OS_APP_FLAG_MAX 3 //0-255*8(内存占用:N/8(+1) bytes),==0时不使用,不占内存
#define OS_APP_MUTEX_MAX 2 //0-255(内存占用: N bytes) ,==0时不使用,不占内存
#define OS_APP_QUEUE_MAX 2 //0-255 (内存占用:N^2 bytes) ,==0时不使用,不占内存
#define _RAM_ALGO_ 0 //0-rom,1-ram,算法数组保存位置。
#define OSClock_1US (SystemCoreClock/8/1000000) //OS 1us频率,(stm32f1--72MHz 8分频 = 9MHz,1us频率=9)
/**************************************************************************************/
//APP状态
#define APP_STATE_RUNNING 1
#define APP_STATE_PENDING 2
//系统布尔值
typedef enum
{
OS_FALSE=0,
OS_TRUE,
}os_bool;
//pend方式
#define APP_BLOCK 0
#define APP_UNBLOCK 1
#if ( OS_APP_MAX < 16 )
#if ( _RAM_ALGO_ == 1 )
extern os_u8 BIT_MAP[16];
#else
extern os_u8 const BIT_MAP[16];
#endif
#else
#ifdef _RAM_ALGO_
extern os_u8 const BIT_MAP[256];
#else
extern os_u8 const BIT_MAP[256];
#endif
#endif
//APP控制块类型定义
typedef struct
{
os_stk *stk_ptr; //APP栈指针 (必须是第一个)
os_u32 delay_clock;//APP延时时间
os_u8 state; //APP状态
os_u8 prio; //APP优先级
}OS_ACB;
extern OS_ACB os_acb_list[OS_APP_MAX]; //各个APP的ACB,数组方式(标号0-空闲APP,标号1-app_01--标号n-app_n)
extern OS_ACB *os_acb_cur; //当前正在运行的APP
extern OS_ACB *os_acb_rdy; //下个即将运行的APP
//系统变量类型定义
typedef struct
{
os_u32 clock_counter; //系统时钟节拍累计变量
os_u32 app_clock;//APP时间切片(为系统时钟节拍倍数,APP持续运行的时间
os_bool print_sta;
os_u8 lock_nesting;//APP切换锁定层数统计变量
os_u8 int_nesting;//APP中断层数统计变量
os_u8 app_cur_num; //当前运行态APP的TCB组数标号
os_u8 app_rdy_bit_tbl;
os_u8 app_rdy_grp_bit_tbl;
}OS_SYS;
extern OS_SYS os_sys;//系统变量
//OS提供的打印输出函数
#define os_printf(fmt, ...) { os_lock();if(os_sys.print_sta==OS_FALSE){ os_sys.print_sta=OS_TRUE;printf( fmt, ##__VA_ARGS__); os_sys.print_sta=OS_FALSE;}os_unlock();}//OS提供的打印输出函数
//#define os_printf(fmt, ...) { os_lock();printf( fmt, ##__VA_ARGS__);os_unlock();}//OS提供的打印输出函数
void os_main(void); //系统主函数(主要用来创建APP)
void API_os_core_enter(void); //关闭全局中断函数(在汇编中)
void API_os_core_exit(void); //打开全局中断函数(在汇编中)
void os_init(void); //系统初始使化函数
void os_startup(void); //系统启动函数
void API_os_systick_init(void);
void API_os_systick_handler(void); //系统定时器中断函数(把此函数放在硬件定时器中断函数中)
void API_os_systick_on(void);
void API_os_systick_off(void);
void API_os_systick_irq_on(void);
void API_os_systick_irq_off(void);
void API_os_pendsv_init(void);
void os_user_init(void); //用户代码初始化函数(用户的初使化代码放在此函数中)
void API_os_psp_reset(void); //PSP指针初使化
void os_scheduler(void); //APP调度器
void API_os_sched_pulse(void); //APP环境切换函数
void os_sched_and_switch(void); //APP调度并切换函数
void app_rdy_tbl_set(os_u8 app_num); //就绪列表置位表示 已就绪
void app_rdy_tbl_reset(os_u8 app_num); //就绪列表复位表示 未就绪
void os_app_rdy_num_update(void);//更新下个运行的APP
os_stk* os_app_stk_init(void* app,os_stk *topstkptr); //APP堆栈初使化函数
void app_ide(void); //空闲APP函数体
void os_app_create_idle(void);
//用户可用API
void os_app_create(void* app,os_stk *topstkptr,os_u8 prio); //APP创建函数
void os_app_pend(os_u8 prio); //挂起优先级为prio的APP
void os_app_resume(os_u8 prio); //恢复优先级为prio的APP
void os_lock(void); //APP切换上锁函数
void os_unlock(void); //APP切换解锁函数
os_u32 os_clock_get(void); //获取系统时钟节拍数函数
void delay_us(os_u32 us); //微秒延时函数
void delay_ms(os_u32 ms); //毫秒延时函数
void os_delay(os_u32 tick); //APP延时函数
os_bool os_app_flag_pend(os_u8 blk_sta,os_u8 id); //blk_sta=0或APP_BLOCK阻塞,=1或APP_UNBLOCK非阻塞(返回OS_TRUE表示收到POST)
os_bool os_app_mutex_pend(os_u8 blk_sta,os_u8 id); //blk_sta=0阻塞,=1非阻塞(返回OS_TRUE表示收到POST)
os_u8 os_app_queue_pend(os_u8 blk_sta,os_u8 id); //blk_sta=0阻塞(不等于当前id则阻塞),=1非阻塞(返回队列序号)
void os_app_flag_post(os_u8 id);
void os_app_mutex_post(os_u8 id);
os_bool os_app_queue_post(os_u8 id); //返回OS_TRUE表示发送成功,OS_FALSE表示发送失败(队列已满)
#endif
复制代码
Keil代码下载:
硬件的另一种代码.7z
(199.75 KB, 下载次数: 19)
2021-11-16 22:10 上传
点击文件名下载附件
硬件端代码
下载积分: 黑币 -5
01.设计文档.docx
(179.64 KB, 下载次数: 20)
2021-11-16 11:45 上传
点击文件名下载附件
上位机设计文档
下载积分: 黑币 -5
资料:
http://www.51hei.com/bbs/dpj-214412-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1