UCOSIII(二)
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h" //任务1控制块
OS_TCB Task1_TCB; void task1(void *parg); CPU_STK task1_stk[]; //任务1的任务堆栈,大小为128字,也就是512字节 //任务2控制块
OS_TCB Task2_TCB; void task2(void *parg); CPU_STK task2_stk[]; //任务2的任务堆栈,大小为128字,也就是512字节 OS_SEM SYNC_SEM; //定义一个信号量,用于任务同步 //主函数
int main(void)
{
OS_ERR err; delay_init(); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(); //串口初始化
LED_Init(); //LED初始化 //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err); //创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块
(CPU_CHAR *)"Task1", //任务的名字
(OS_TASK_PTR)task1, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建一个信号量
OSSemCreate ((OS_SEM* )&SYNC_SEM,
(CPU_CHAR* )"SYNC_SEM",
(OS_SEM_CTR),
(OS_ERR* )&err); //启动OS,进行任务调度
OSStart(&err); } void task1(void *parg)
{
OS_ERR err; printf("task1 is create ok\r\n"); while()
{ OSSemPend(&SYNC_SEM,,OS_OPT_PEND_BLOCKING,,&err); //请求信号量 printf("task1 is running ...\r\n"); } } void task2(void *parg)
{
OS_ERR err; printf("task2 is create ok\r\n"); while()
{
//连续发送3个信号量
OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err); //发送信号量
OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err); //发送信号量
OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err); //发送信号量 printf("task2 is running ...\r\n"); OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时10ms
}
}
信号量
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h" //任务1控制块
OS_TCB Task1_TCB; void task1(void *parg); CPU_STK task1_stk[]; //任务1的任务堆栈,大小为128字,也就是512字节 //任务2控制块
OS_TCB Task2_TCB; void task2(void *parg); CPU_STK task2_stk[]; //任务2的任务堆栈,大小为128字,也就是512字节 //任务3控制块
OS_TCB Task3_TCB; void task3(void *parg); CPU_STK task3_stk[]; //任务2的任务堆栈,大小为128字,也就是512字节 OS_FLAG_GRP g_os_flag; //定义一个事件标志组 //按键初始化函数
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE,ENABLE); //使能GPIOA GPIOE时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //PE2,3,4引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; //输入
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; //上拉输入
GPIO_Init(GPIOE,&GPIO_InitStructure); //初始化GPIOE GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //PA0引脚
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN; //下拉输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIOA
} //主函数
int main(void)
{
OS_ERR err; delay_init(); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(); //串口初始化
LED_Init(); //LED初始化 //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err); //创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块
(CPU_CHAR *)"Task1", //任务的名字
(OS_TASK_PTR)task1, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建任务3
OSTaskCreate( (OS_TCB *)&Task3_TCB, //任务控制块
(CPU_CHAR *)"Task3", //任务的名字
(OS_TASK_PTR)task3, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task3_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建一个事件标志组
OSFlagCreate( (OS_FLAG_GRP* )&g_os_flag,
(CPU_CHAR*)"os_flag",
(OS_FLAGS),
(OS_ERR* )&err); //按键初始化
KEY_Init(); //启动OS,进行任务调度
OSStart(&err); } void task1(void *parg)
{
OS_ERR err; OS_FLAGS os_flag; printf("task1 is create ok\r\n"); while()
{
if(PAin() == )
{
//去抖动
OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时20ms if(PAin() == )
{
//发送事件标志,标志值为0x1,设置g_os_flag的bit0为1
os_flag= OSFlagPost((OS_FLAG_GRP* )&g_os_flag,
(OS_FLAGS)0x1,
(OS_OPT)OS_OPT_POST_FLAG_SET,
&err); printf("task1,os_flag=%02X\r\n",os_flag); } } OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时20ms } } void task2(void *parg)
{
OS_ERR err; OS_FLAGS os_flag; printf("task2 is create ok\r\n"); while()
{
if(PEin() == )
{
OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时20ms if(PEin() == )
{
//发送事件标志,标志值为0x2,设置g_os_flag的bit1为1
os_flag= OSFlagPost((OS_FLAG_GRP* )&g_os_flag,
(OS_FLAGS)0x2,
(OS_OPT)OS_OPT_POST_FLAG_SET,
&err); printf("task2,os_flag=%02X\r\n",os_flag); } } OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时20ms } } void task3(void *parg)
{
OS_ERR err; OS_FLAGS os_flag; printf("task3 is create ok\r\n"); while()
{
//OS_OPT_PEND_FLAG_SET_ANY 和OS_OPT_PEND_FLAG_SET_ALL是有区别的
//前者是等待任意一个事件,后者要确保所有事件成立
os_flag= OSFlagPend((OS_FLAG_GRP* )&g_os_flag,
(OS_FLAGS)0x3, //等待bit1和bit0置位
(OS_TICK), //0代表是默认一直阻塞等待
(OS_OPT)OS_OPT_PEND_FLAG_SET_ANY+OS_OPT_PEND_FLAG_CONSUME, //等待事件标志组任何一位置位
(CPU_TS *), //默认不记录时间戳
&err); printf("task3,os_flag=%02X\r\n",os_flag); } }
事件
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h" //任务1控制块
OS_TCB Task1_TCB; void task1(void *parg); CPU_STK task1_stk[]; //任务1的任务堆栈,大小为128字,也就是512字节 //任务2控制块
OS_TCB Task2_TCB; void task2(void *parg); CPU_STK task2_stk[]; //任务2的任务堆栈,大小为128字,也就是512字节 #define TASK_Q_NUM 64 //发任务内建消息队列的长度 //主函数
int main(void)
{
OS_ERR err; delay_init(); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(); //串口初始化
LED_Init(); //LED初始化 //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err); //创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块
(CPU_CHAR *)"Task1", //任务的名字
(OS_TASK_PTR)task1, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY)TASK_Q_NUM, //任务2需要使用内建消息队列,消息队列长度为64个字
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //启动OS,进行任务调度
OSStart(&err); } void task1(void *parg)
{
uint32_t msg_cnt=; char pbuf[]; OS_ERR err; printf("task1 is create ok\r\n"); while()
{ msg_cnt++; sprintf((char*)pbuf,"msg_cnt=%d\r\n",msg_cnt); //发送消息
OSTaskQPost((OS_TCB* )&Task2_TCB, //向任务task2发送消息
(void* )pbuf,
(OS_MSG_SIZE)strlen(pbuf),
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err); printf("task1 is running ...\r\n"); OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S } } void task2(void *parg)
{
char *p;
OS_MSG_SIZE size; OS_ERR err; printf("task2 is create ok\r\n"); while()
{
//请求消息
p=OSTaskQPend((OS_TICK ),
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE* )&size,
(CPU_TS* ),
(OS_ERR* )&err ); printf("task2 is running ...\r\n");
printf(p);
}
}
消息队列
/*
描述: 1.当前创建了软件定时器1,工作频率为100Hz,优先级为2,可在os_cfg_app.h进行设置
#define OS_CFG_TMR_TASK_PRIO 2u
#define OS_CFG_TMR_TASK_RATE_HZ 100u 2.创建任务1,优先级为3,;创建任务2,优先级为4
*/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h" //任务1控制块
OS_TCB Task1_TCB; void task1(void *parg); CPU_STK task1_stk[]; //任务1的任务堆栈,大小为128字,也就是512字节 //任务2控制块
OS_TCB Task2_TCB; void task2(void *parg); CPU_STK task2_stk[]; //任务2的任务堆栈,大小为128字,也就是512字节 OS_TMR tmr1; //定时器1
//软件定时器1回调函数
void tmr1_callback(void *ptmr,void *p_arg); //主函数
int main(void)
{
OS_ERR err; delay_init(); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(); //串口初始化
LED_Init(); //LED初始化 //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err); //创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块
(CPU_CHAR *)"Task1", //任务的名字
(OS_TASK_PTR)task1, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建软件定时器1
OSTmrCreate( (OS_TMR *)&tmr1, //软件定时器1
(CPU_CHAR *)"tmr1", //定时器名字
(OS_TICK ), //20*10=200ms,延迟200ms执行
(OS_TICK ), //100*10=1000ms,执行周期为1000ms
(OS_OPT )OS_OPT_TMR_PERIODIC, //周期模式
(OS_TMR_CALLBACK_PTR )tmr1_callback, //软件定时器1回调函数
(void *), //参数为0
(OS_ERR *)&err); //返回的错误码 //启动软件定时器1
OSTmrStart(&tmr1,&err); //启动OS,进行任务调度
OSStart(&err); } void task1(void *parg)
{
OS_ERR err; printf("task1 is create ok\r\n"); while()
{
printf("task1 is running ...\r\n"); OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S }
} void task2(void *parg)
{
OS_ERR err; printf("task2 is create ok\r\n"); while()
{ printf("task2 is running ...\r\n"); OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时1S }
} void tmr1_callback(void *ptmr,void *p_arg)
{
//软件定时器回调函数禁止使用任何的阻塞或者删除定时器函数
printf("tmr1_callback\r\n");
}
软件定时器
/*
描述: 1.当前创建了软件定时器1,工作频率为100Hz,优先级为2,可在os_cfg_app.h进行设置
#define OS_CFG_TMR_TASK_PRIO 2u
#define OS_CFG_TMR_TASK_RATE_HZ 100u 2.创建任务1,优先级为3,;创建任务2,优先级为4 3.测试结果: 任务1、任务2、软件定时器回调函数通过临界区代码保护了共享资源,各任务之间很好地执行
*/
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "includes.h" //任务1控制块
OS_TCB Task1_TCB; void task1(void *parg); CPU_STK task1_stk[]; //任务1的任务堆栈,大小为128字,也就是512字节 //任务2控制块
OS_TCB Task2_TCB; void task2(void *parg); CPU_STK task2_stk[]; //任务2的任务堆栈,大小为128字,也就是512字节 OS_TMR tmr1; //定时器1
//软件定时器1回调函数
void tmr1_callback(void *ptmr,void *p_arg); OS_Q queue; //声明消息队列
OS_SEM sem; //声明多值信号量
OS_PEND_DATA mul_pend_array [ ]; //声明等待对象数组 //主函数
int main(void)
{
OS_ERR err; delay_init(); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
uart_init(); //串口初始化
LED_Init(); //LED初始化 //OS初始化,它是第一个运行的函数,初始化各种的全局变量,例如中断嵌套计数器、优先级、存储器
OSInit(&err); //创建任务1
OSTaskCreate( (OS_TCB *)&Task1_TCB, //任务控制块
(CPU_CHAR *)"Task1", //任务的名字
(OS_TASK_PTR)task1, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task1_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //禁止任务消息队列
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建任务2
OSTaskCreate( (OS_TCB *)&Task2_TCB, //任务控制块
(CPU_CHAR *)"Task2", //任务的名字
(OS_TASK_PTR)task2, //任务函数
(void *), //传递参数
(OS_PRIO), //任务的优先级
(CPU_STK *)task2_stk, //任务堆栈基地址
(CPU_STK_SIZE)/, //任务堆栈深度限位,用到这个位置,任务不能再继续使用
(CPU_STK_SIZE), //任务堆栈大小
(OS_MSG_QTY), //任务消息队列64字
(OS_TICK), //默认时间片长度
(void *), //不需要补充用户存储区
(OS_OPT)OS_OPT_TASK_NONE, //没有任何选项
&err //返回的错误码
); //创建软件定时器1
OSTmrCreate( (OS_TMR *)&tmr1,
(CPU_CHAR *)"tmr1",
(OS_TICK ),
(OS_TICK ),
(OS_OPT )OS_OPT_TMR_PERIODIC,
(OS_TMR_CALLBACK_PTR )tmr1_callback,
(void *),
(OS_ERR *)&err); //启动软件定时器1
OSTmrStart(&tmr1,&err); /* 创建多值信号量 sem */
OSSemCreate ( (OS_SEM *)&sem, //指向要创建的多值信号量
(CPU_CHAR *)"Sem For Test", //多值信号量的名字
(OS_SEM_CTR ), //多值信号量初始不可用
(OS_ERR *)&err); //返回错误类型 /* 创建消息队列 queue */
OSQCreate ( (OS_Q *)&queue, //指向要创建的消息队列
(CPU_CHAR *)"Queue For Test", //消息队列的名字
(OS_MSG_QTY ), //最多可容20条消息
(OS_ERR *)&err); //返回错误类型 /* 初始化要等待的多个内核对象 */
mul_pend_array [ ] .PendObjPtr = ( OS_PEND_OBJ * ) & sem;
mul_pend_array [ ] .PendObjPtr = ( OS_PEND_OBJ * ) & queue; //启动OS,进行任务调度
OSStart(&err); } void task1(void *parg)
{
static uint32_t task_cnt=; char buf[]={}; OS_ERR err; printf("task1 is create ok\r\n"); while()
{
task_cnt++; sprintf(buf,"task1 run cnt=%d",task_cnt); /* 发布消息到消息队列 queue */
OSQPost ( (OS_Q *)&queue, //消息队列
(void *)buf, //消息内容
(OS_MSG_SIZE )strlen(buf), //消息长度
(OS_OPT )OS_OPT_POST_FIFO|OS_OPT_POST_ALL, //发到队列且发送给所有任务
(OS_ERR *)&err); //返回错误类型 OSTimeDlyHMSM(,,,,OS_OPT_TIME_HMSM_STRICT,&err); //延时3S }
} void task2(void *parg)
{
OS_ERR err; printf("task2 is create ok\r\n"); while()
{
/* 等待多个内核对象 */
OSPendMulti((OS_PEND_DATA *)mul_pend_array, //等待对象数组
(OS_OBJ_QTY ), //等待对象数目
(OS_TICK ), //无期限等待
(OS_OPT )OS_OPT_PEND_BLOCKING, //阻塞任务
(OS_ERR *)&err); //返回错误类型 /* 查看哪些等待对象可用 */
if ( mul_pend_array [] .RdyObjPtr == mul_pend_array [] .PendObjPtr ) //如果 sem 可用
{
printf("find tmr1 running...\r\n");
} if ( mul_pend_array [] .RdyObjPtr == mul_pend_array [] .PendObjPtr )//如果 queue 可用
{
printf("recv msg:%s,len:%d\r\n",(char *) mul_pend_array[] .RdyMsgPtr, mul_pend_array [] .RdyMsgSize );
} }
} //软件定时器回调函数禁止使用任何的阻塞或者删除定时器函数
void tmr1_callback(void *ptmr,void *p_arg)
{
OS_ERR err; OSSemPost(&sem,OS_OPT_POST_1,&err); //释放信号量
}
等待多个内核对象
UCOSIII(二)的更多相关文章
- 【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
第14章 uCOS-III操作系统版本二代示波器实现 本章教程为大家讲解uCOS-III操作系统版本的二代示波器实现.主要讲解RTOS设计框架,即各个任务实现的功能,任务间的通信方案选择,任 ...
- 备忘:移植ucos-III到stm32f103c8t6
由于本人对linux系统内核这块比较感兴趣,下一份工作想做linux驱动相关的:于是最近一旦有空都在研究linux内核源码,面对linux内核这个庞然大物,越看越觉得不能太过急躁,且由于还要工作,只能 ...
- 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告
<基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...
- 20155227辜彦霖《基于Cortex-M4的UCOSIII的应用》课程设计个人报告
20155227辜彦霖<基于Cortex-M4的UCOSIII的应用>课程设计个人报告 一.个人贡献 参与课设题目讨论及完成全过程: 资料收集: 负责主要代码调试: 撰写小组结题报告. 二 ...
- 玩转X-CTR100 l STM32F4 l UCOS-III移植
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 概述 前后台系统 简单的小型系统设计一般是基于前后台 ...
- 嵌入式:UCOSIII的使用(17.01.24补充)
0.一些移植.系统相关 OS_CFG_APP.H /* --------------------- MISCELLANEOUS ------------------ */ #define OS_CFG ...
- stm32之UCOS-III
一.UCOS-III 学习UCOS-III,一般会学习以下内容: 任务创建.删除.挂起.恢复等: 临界区:独占CPU,尽量少用,否则会降低效率: 时间管理:时钟节拍(基于硬件定时器).软件定时器: 互 ...
- uCos-III移植到STM32F10x
最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境.百度介绍:http://baike.baidu.com/view/8531313.htm 环境: S ...
- 【转】UCOSIII基础知识点
1.其中最有用的功能应该是时间片轮转法( roundrobin), 这个是 uC/OS-II 中不支持的,但是现在已经是 uC/OS-III 的一个功能了 2.uC/OS-III 被设计用于 32 位 ...
随机推荐
- Win10 收件箱添加QQ邮箱(2019年5月19日)
Emmm弄的时候没截图,就语言描述吧,非常简单. 登录到网页端QQ邮箱.点我登录 登录之后,界面上端的Logo右边有个"设置"(字有点小).点它 邮箱设置下面有一堆标签,点击&qu ...
- MySQL部分2
- Codeforces 666E Forensic Examination(广义后缀自动机+线段树合并)
将所有串(包括S)放一块建SAM.对于询问,倍增定位出该子串所在节点,然后要查询的就是该子串在区间内的哪个字符串出现最多.可以线段树合并求出该节点在每个字符串中的出现次数. #include<b ...
- (一)XML基础(1)
一.什么是XML? XML是指可扩展标记语言(eXtensible MarkupLanguage),它是一种标记语言.它被设计的宗旨是描述数据(XML),而非显示数据(HTML). 目前遵循的是W3C ...
- restTemplate源码解析(一)构造restTemplate的Bean实例
所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 构造一个restTemplate的Bean实例很容易,只需这样配置 @Bean publ ...
- centos禁止root用户ssh远程登录
首先,我们要以root身份登录远程主机 vim指令编辑ssh配置文件,如 vim /etc/ssh/sshd_config 查找PermitRootLogin,把yes改为no 修改完配置需要重启ss ...
- 详解为什么设置overflow为hidden可以清除浮动带来的影响
1.问题起源 在平时的业务开发写CSS中,为了满足页面布局,元素的浮动特性我们用的不能再多了.使用浮动的确能够解决一些布局问题,但是也带了一些副作用影响,比如,父元素高度塌陷,我们有好几种可以清除浮动 ...
- 堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出
来源:http://blog.itpub.net/8797129/viewspace-693648/ 简单的可以理解为:heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的.sta ...
- 使用MySQL审计Plugin
本文来源:http://blog.chinaunix.net/uid-20785090-id-5018977.html 越来越多的企业把应用往mysql上迁移,这时候对数据库的审计又成了一件紧急的事情 ...
- Java基础 @org.junit.Test-单元测试方法 + 操纵Collection和Map的工具类 : Collections 的sort/binarySearch/max/min等静态方法
单元测试代码: ( 在IDEA中先输入'@Test '然后根据提示进行自动修订即可!!运行时直接运行即可! 若有多个单元测试块的时候,直接把鼠标放在哪里就自动在哪里运行那个单元块) import ...