初级会员
积分 151
金钱 151
注册时间 2017-3-29
在线时间 39 小时
1 金钱
我配置的思路也是按照例子来的,但是最后编译的时候会提示下面一个警告和一个错误main.c(216): warning: #223-D: function "OSPendMulti" declared implicitly
index=OSPendMulti(
main.c: 1 warning, 0 errors
..\OBJ\Template.axf: Error: L6218E: Undefined symbol OSPendMulti (referred from main.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.
我UCOSIII的配置是按照书里和视频里来的,前面的例子使用的时候没有出现问题,但是这里出现了引用的问题,不知道是哪里配置出了问题
下面是配置代码:
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "sys.h"
#include "includes.h"
#include "led.h"
#include "LCD.h"
#include "stdlib.h"
#include <os_app_hooks.h>
#include "key.h"
#include "malloc.h"
#include "SRAM.h"
//任务优先级
#define START_TASK_PRIO 3
//任务堆栈大小
#define START_STK_SIZE 128
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);
/*****************************************************************/
#define UOSCIII_MultiCore
int lcd_discolor[14]={
WHITE, BLACK, BLUE, BRED,
GRED, GBLUE, RED, MAGENTA,
GREEN, CYAN, YELLOW,BROWN,
BRRED, GRAY
};
/*****************************************************************/
#ifdef UOSCIII_MultiCore
#define TASK1_TASK_PRIO 4
#define TASK1_STK_SIZE 128
OS_TCB TASK1_TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);
#define MULTI_TASK_PRIO 5
#define MULTI_STK_SIZE 128
OS_TCB MULTI_TaskTCB;
CPU_STK MULTI_TASK_STK[MULTI_STK_SIZE];
void multi_task(void *p_arg);
OS_SEM Test_Sem1;//信息量
OS_SEM Test_Sem2;//信息量
OS_Q Test_Q;//消息队列
#define QUEUE_NUM 10//消息队列长度
#define CORE_OBJ_NUM 3//内核对象个数一共3个:2个信号量和1个消息队列
int main(void){
OS_ERR err;
CPU_SR_ALLOC();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
INTX_DISABLE();
BSP_Init();
POINT_COLOR=RED;
LCD_ShowString(30,10,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,30,200,16,16,"UCOSIII Examp 13-1");
LCD_ShowString(30,50,200,16,16,"Events Flags");
LCD_ShowString(30,70,220,16,16,"KEY_UP:LED1 KEY0:Refresh LCD");
LCD_ShowString(30,90,200,16,16,"KEY1:Tmr1 KEY2:BEEP");
POINT_COLOR=BLACK;
LCD_DrawRectangle(5,110,234,314);
LCD_DrawLine(5,130,234,130);
POINT_COLOR=RED;
LCD_ShowString(50,111,200,16,16,"ObjRdy_Num: 0");
POINT_COLOR=BLUE;
INTX_ENABLE();
OSInit(&err);
OS_CRITICAL_ENTER();
OSTaskCreate(
(OS_TCB *)&StartTaskTCB,
(CPU_CHAR *)"start task",
(OS_TASK_PTR)start_task,
(void *)0,
(OS_PRIO)START_TASK_PRIO,
(CPU_STK *)&START_TASK_STK[0],
(CPU_STK_SIZE)START_STK_SIZE/10,
(CPU_STK_SIZE)START_STK_SIZE,
(OS_MSG_QTY)0,
(OS_TICK)0,
(void *)0,
(OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR *)&err
);
OS_CRITICAL_EXIT();
OSStart(&err);
}
void start_task(void *p_arg){
OS_ERR err;
CPU_SR_ALLOC();
p_arg=p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //统计任务
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了测量中断关闭时间
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER();
OSSemCreate(
(OS_SEM *)&Test_Sem1,
(CPU_CHAR *)"Test Sem1",
(OS_SEM_CTR)0,
(OS_ERR *)&err
);
OSSemCreate(
(OS_SEM *)&Test_Sem2,
(CPU_CHAR *)"Test Sem2",
(OS_SEM_CTR)0,
(OS_ERR *)&err
);
OSQCreate(
(OS_Q *)&Test_Q,
(CPU_CHAR *)"KEY Msg",
(OS_MSG_QTY)QUEUE_NUM,
(OS_ERR *)&err
);
OSTaskCreate(
(OS_TCB *)&TASK1_TaskTCB,
(CPU_CHAR *)"task1 task",
(OS_TASK_PTR)task1_task,
(void *)0,
(OS_PRIO)TASK1_TASK_PRIO,
(CPU_STK *)&TASK1_TASK_STK[0],
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY)0,
(OS_TICK)0,
(void *)0,
(OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR *)&err
);
OSTaskCreate(
(OS_TCB *)&MULTI_TaskTCB,
(CPU_CHAR *)"multi task",
(OS_TASK_PTR)multi_task,
(void *)0,
(OS_PRIO)MULTI_TASK_PRIO,
(CPU_STK *)&MULTI_TASK_STK[0],
(CPU_STK_SIZE)MULTI_STK_SIZE/10,
(CPU_STK_SIZE)MULTI_STK_SIZE,
(OS_MSG_QTY)0,
(OS_TICK)0,
(void *)0,
(OS_OPT)OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR *)&err
);
OS_CRITICAL_EXIT();
OSTaskDel((OS_TCB *)0, &err);
}
void task1_task(void *p_arg){
u8 key;
OS_ERR err;
u8 num;
u8 *pbuf;
static u8 msg_num;
pbuf=mymalloc(SRAMIN,10);
while(1){
key=KEY_Scan(0);
switch(key){
case KEY1_PRES:
//发送信号量Test_Sem1
OSSemPost(&Test_Sem1, OS_OPT_POST_1, &err);
break;
case KEY0_PRES:
//发送信号量Test_Sem2
OSSemPost(&Test_Sem2, OS_OPT_POST_1, &err);
break;
case WKUP_PRES:
msg_num++;
sprintf((char *)pbuf, "ALIENTEK %d",msg_num);
//将pbuf的值发送给消息队列Test_Q
OSQPost(
(OS_Q *)&Test_Q,
(void *)pbuf,
(OS_MSG_SIZE)10,
(OS_OPT)OS_OPT_POST_FIFO,
(OS_ERR *)&err
);
break;
}
num++;
if(num==50){
num=0;
LED0=~LED0;
}
OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC, &err);
}
}
void multi_task(void *p_arg){
u8 num;
OS_ERR err;
OS_OBJ_QTY index;
OS_PEND_DATA pend_multi_tbl[CORE_OBJ_NUM];//定义的OS_PEND_DATA类型数组来表示含有多少个内核对象
pend_multi_tbl[0].PendObjPtr=(OS_PEND_OBJ *)&Test_Sem1;
pend_multi_tbl[1].PendObjPtr=(OS_PEND_OBJ *)&Test_Sem2;
pend_multi_tbl[2].PendObjPtr=(OS_PEND_OBJ *)&Test_Q;
while(1){
//OSPendMulti等待内核对象,如果对象中有多个可用,则所有可用的信号量和消息都将返回给调用者,如果没有任何对象可用,则挂起当前任务等待:
//对象变为可用/达到设定的超时时间/一个或多个任务被删除或终止
index=OSPendMulti(
(OS_PEND_DATA *)pend_multi_tbl,//多内核对象定义
(OS_OBJ_QTY)CORE_OBJ_NUM,//内核对象数量
(OS_TICK)0,//等待对象反应时间,设置成0若没有对象则一直等待下去
(OS_OPT)OS_OPT_PEND_BLOCKING,//阻塞模式确定是否在没有任务下进行等待,与OS_TICK一起使用
(OS_ERR *)&err
);
LCD_ShowNum(147,111,index,1,16);
num++;
LCD_Fill(6,131,233,313,lcd_discolor[num%14]);
LED1=~LED1;
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);
}
}
void BSP_Init(void){
uart_init(115200);
delay_init(168);
LED_Init();
LCD_Init();
KEY_Init();
FSMC_SRAM_Init();
my_mem_init(SRAMIN);
}
复制代码
我来回答