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 位 ...
随机推荐
- 1266: gcd和lcm(Java)
WUSTOJ 1266: gcd和lcm 参考 1naive1的博客 Description 已知a,b的最大公约数为x,也即gcd(a,b)=x; a,b的最小公倍数为y,也即lcm(a,b)= ...
- 项目遇到的问题:页面c:forEach循环的数据进行计算传回后台并保持到数据库
应该还有更简单的方法 但是我不晓得 手动给文本框输入数据保存到数据库 A表 :通过订单编号 查询数据获得 B表 :通过A表中的字段查询遍历获得 问题: 手动输入文本框内容 保存到数据库 页面form提 ...
- 通俗化理解Spring3 IoC的原理和主要组件
♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转( ...
- .NetCore如何使用ImageSharp进行图片的生成
ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形.验证码等方式进行探讨和实践. 今天我分享一下所在公司项目的实际应用案例,导出微信二维码图片, ...
- 如何把Windows主机中的文件拉到centOS虚拟机中
如何把Windows主机中的文件拉到centOS虚拟机中 2017年02月19日 22:19:12 Ariel_lin2017 阅读数:6023 标签: vmware tools共享文件 之前写了 ...
- js大数计算之展示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- DRDA
在谈到分布式DB2数据时,有必要谈谈DRDA. DRDA代表分布式关系数据库体系结构. 它是由IBM开发的一种体系结构,它使关系数据能够在多个平台之间分布. 平台和平台都可以相互通信. 例如,一个DB ...
- Django中使用xadmin作为后台管理页面
xadmin后台管理 安装:luffy虚拟环境下 # >: pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 ...
- 10.Vue请求远端数据库
代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 深度解析Droupout与Batch Normalization
Droupout与Batch Normalization都是深度学习常用且基础的训练技巧了.本文将从理论和实践两个角度分布其特点和细节. Droupout 2012年,Hinton在其论文中提出Dro ...