|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
遥控器软件选择FreeRTOS ,现将部分代码分享出来
int main(void)
{
__set_PRIMASK(1);//关全局中断
W25_dat.Sector=0xffff;//设置W25x40内存数据不可用
BSP_Config();//硬件及软件配置
AppResourcesInit();//任务资源初始化
#if TASK_DEBUG
xTaskCreate(Simulation_Task,"Simulation_Task1",512,NULL,1,NULL); //仿真调试监视任务
xTaskCreate(UartDebug_Task,"UartDebug_Task",512,NULL,3,NULL); //串口仿真调试监视任务
UartRxQueue = xQueueCreate(10, sizeof(P_DAT) );//创建串口接收队列
#endif
xTaskCreate(Dog_Task,"Dog_200mS",256,NULL,5,NULL); //看门狗监视任务
xTaskCreate(AppInit_Task,"AppInit",512,NULL,9,&AppInitHandleTaskStart); //应用初始化任务
vTaskStartScheduler();//开始调度任务
while(1)
{}
}
void AppInit_Task( void *pvParameters ) //应用初始化任务
{
#if TASK_DEBUG
u8 buf[20];
#endif
portTickType xLastWakeTime;
const TickType_t xTicksToWait = 50 / portTICK_PERIOD_MS; /* 延迟50ms */
xLastWakeTime=xTaskGetTickCount();//获取当前心跳值
#if TASK_DEBUG
DPrintfGetTheKey(); //获取打印资源
DPrintf("\r\n初始化任务已经启动\r\n");
DPrintfGiveUpKey();//释放打印资源
#endif
for( ;; )
{
vTaskDelayUntil(&xLastWakeTime,xTicksToWait);
Spi2GetTheKey();//获取Spi2的钥匙
/**********************FLASH芯片初始化************************/
W25_dat.ChipID=W25_DeviceID();//读取芯片的8位型号ID 唤醒芯片
W25_dat.Jedec_Id=W25_JEDEC_ID();//读取芯片的制造商ID和16位型号ID
if(W25_ReadSector(0)==0)W25_ReadSector(0);//读指定扇区的数据到内存 如果失败在读取一次
if((W25_dat.page[0][0]!=0x18)||(W25_dat.page[0][1]!=0x18))//判断FLASH是否需要初始化
{//以下更新内存
W25_dat.page[0][0]=0x18;W25_dat.page[0][1]=0x18;
ee_wrfun();//初始化写EE数据
for(;W25_WeadeSector()==0;);//将内存的数据写入FLASH
}
else//读取已经初始化的数据
{
ee_rdfun();//初始化读EE数据
}
Spi2GiveUpKey();//归还Spi2的钥匙
/***************打印输出初始化数据*****************/
#if TASK_DEBUG
DPrintfGetTheKey(); //获取打印资源
DPrintf("\r\nFLASH初始化完成\r\n");
U8_Uchar(&W25_dat.ChipID,buf,3);buf[3]='\r';buf[4]='\n';buf[5]=0;
DPrintf("\r\nFLASH ID编号:");DPrintf((const signed char *)buf);
DPrintf("\r\n初始化任务删除自身任务\r\n");
DPrintfGiveUpKey();//释放打印资源
#endif
LcmInit();//液晶初始化?
lcd_rst_flag=1;//液晶完成初始化
AppTaskCreate();//创建任务
vTaskDelete(AppInitHandleTaskStart);//应用初始化任务执行一次后删除任务
}
}
void Dog_Task( void *pvParameters ) //看门狗监视任务
{
EventBits_t uxBits;
portTickType xLastWakeTime;
const TickType_t xTicksToWait = 200 / portTICK_PERIOD_MS; /* 延迟200ms */
xLastWakeTime=xTaskGetTickCount();//获取当前心跳值
/*
开始执行启动任务主函数前使能独立看门狗。
设置LSI是128分频,下面函数参数范围0-0xFFF,分别代表最小值3.2ms和最大值13107.2ms
下面设置的是1s,如果1s内没有喂狗,系统复位。
*/
bsp_InitIwdg(0x138);
#if TASK_DEBUG
DPrintfGetTheKey(); //获取打印资源
DPrintf("\r\n监视任务已经启动 \r\n");
DPrintfGiveUpKey();//释放打印资源
#endif
for( ;; )
{
vTaskDelayUntil(&xLastWakeTime,xTicksToWait);
/* 等待所有任务发来事件标志 */
uxBits = xEventGroupWaitBits(DogEventGroup, /* 事件标志组句柄 */
TASK_BIT_0_1, /* 等碩ASK_BIT_0_1被设置 */
pdTRUE, /* 退出前TASK_BIT_0_1被清除,这里是TASK_BIT_0_1都被设置才表示“退出”*/
pdTRUE, /* 设置为pdTRUE表示等待TASK_BIT_0_1都被设置*/
xTicksToWait); /* 等待延迟时间 */
if((uxBits & TASK_BIT_0_1) == TASK_BIT_0_1)
{
IWDG_Feed();//喂狗
#if TASK_DEBUG
//DPrintfGetTheKey(); //获取打印资源
//DPrintf("喂狗成功\r\n");
//DPrintfGiveUpKey();//释放打印资源
#endif
}
else
{
#if TASK_DEBUG
//DPrintfGetTheKey(); //获取打印资源
//DPrintf("等待喂狗指令\r\n");
// DPrintfGiveUpKey();//释放打印资源
#endif
}
}
}
void UartDebug_Task( void *pvParameters )//串口仿真调试任务
{
u8 buf[512];
P_DAT p_dat;
u16 len;
for(;;)
{
xQueueReceive(UartRxQueue,&p_dat,portMAX_DELAY);
if(p_dat.id==1)
{
len=UsartTaskRead(&p_dat,buf,USART1_MAX_LEN);//解析读取数据
Uart1GetTheKey();//获取串口1的钥匙
Usart1Tx(buf,len); //发送数据
Uart1GiveUpKey();//归还串口1的钥匙
}
}
}
void Simulation_Task( void *pvParameters )//仿真调试监视任务
{
portTickType xLastWakeTime;
uint8_t pcWriteBuffer[512];
const TickType_t xTicksToWait = 5000 / portTICK_PERIOD_MS; /* 延迟5000ms */
xLastWakeTime=xTaskGetTickCount();//获取当前心跳值
DPrintfGetTheKey(); //获取打印资源
DPrintf("\r\n仿真任务已经启动 \r\n");
DPrintfGiveUpKey();//释放打印资源
for(;;)
{
vTaskDelayUntil(&xLastWakeTime,xTicksToWait);//延迟10s
DPrintfGetTheKey(); //获取打印资源
DPrintf("=================================================\r\n");
DPrintf(" 任务名称 任务状态 优先级 剩余栈 任务序号 \r\n\r\n");
vTaskList( (char *)&pcWriteBuffer );
DPrintf((const signed char *)pcWriteBuffer);
DPrintf("=================================================\r\n");
DPrintf(" 任务名称 运行计数 使用效率 \r\n\r\n");
vTaskGetRunTimeStats( (char *)&pcWriteBuffer );
DPrintf((const signed char *)pcWriteBuffer);
DPrintfGiveUpKey();//释放打印资源
}
}
void AppTaskCreate(void)//创建任务
{
RF2401xQueue = xQueueCreate(10, sizeof(RF_DAT) );//创建RF接收队列
xTaskCreate(Task0,"Task0",512,NULL,3,NULL);
xTaskCreate(ADC_Task,"ADC_Task",256,NULL,8,NULL);
xTaskCreate(URT_DEBUG_Task,"URT_DEBUG_Task",512,NULL,5,NULL);
xTaskCreate(NRF2401_Task,"NRF2401_Task",512,NULL,9,NULL);
xTaskCreate(NRF2401TX_Task,"NRF2401TX_Task",512,NULL,9,NULL);//最高优先级
xTaskCreate(Task_lcd,"Task_lcd",512,NULL,3,NULL);
xTaskCreate(Tim5mS_Task,"Tim10mS",512,NULL,8,NULL); //5毫秒定时器任务
}
void Tim5mS_Task( void *pvParameters ) //5毫秒定时器任务
{ u8 i,rf_da;
RF_DAT rf_dat;
portTickType xLastWakeTime;
const TickType_t xTicksToWait = 5/ portTICK_PERIOD_MS; /* 延迟5ms */
xLastWakeTime=xTaskGetTickCount();//获取当前心跳值
for( ;; )
{
vTaskDelayUntil(&xLastWakeTime,xTicksToWait);//延迟5ms
rf_da++;
if(rf_da>=2){rf_da=0;rf_dat.id=1; rf_dat.p=NULL;xQueueSend(RF2401xQueue,&rf_dat,pdPASS);}
if(bz_con){bz_con--;GPIO_SetBits(GPIOA,GPIO_Pin_12);}//蜂鸣器控制
else{GPIO_ResetBits(GPIOA,GPIO_Pin_12);}
key_bmbuf[key_bmcnt]=GPIO_ReadInputData(GPIOB);
key_bmcnt++;if(key_bmcnt>=20){key_bmcnt=0;if(key_bmflag==0){key_bmflag=1;for(i=0;i<50;i++){key_bmbuff[i]=key_bmbuf[i];}}}
UsartRxQuery();//串口接收查询函数
/* 发送事件标志,表示任务正常运行 */
xEventGroupSetBits(DogEventGroup, TASK_BIT_1);
}
} |
| |