环境:
主机:WIN8
开发环境:MDK4.72
ucgui版本:3.90
ucos版本:ucos-ii
mcu: stm32f103VE
说明:
本示例中task2请求内存分区,然后往分区内写数据,再将数据通过邮箱发送给task1
效果图:
源码:
#define TASK_STK_SIZE 512
/*********************************************************************
* 静态函数
**********************************************************************/
static void task_start(void *pdata);
static void task1(void *pdata);
static void task2(void *pdata);
/*********************************************************************
* 静态变量
**********************************************************************/
/*********************************************************************
* 任务堆栈空间
**********************************************************************/
static OS_STK Task_Start_Stk[TASK_STK_SIZE];
static OS_STK Task1_Stk[TASK_STK_SIZE];
static OS_STK Task2_Stk[TASK_STK_SIZE];
/*********************************************************************
* 信号量
**********************************************************************/
OS_EVENT *Semaphore;
/*********************************************************************
* 消息队列数组
**********************************************************************/
void *Msg_Group[10];
char Msg_Arr[10][30];
uint8_t Index_Msg_Arr = 0;
/*********************************************************************
* 内存分区
**********************************************************************/
OS_MEM *Buffer_Ptr;
uint8_t Buffer[10][30];
/*********************************************************************
* 函数
**********************************************************************/
int main(void)
{
//初始化内核
OSInit();
//创建任务
OSTaskCreate(task_start,(void *)0,Task_Start_Stk + TASK_STK_SIZE - 1,10);
//启动任务
OSStart();
}
/*********************************************************************
* 任务函数
**********************************************************************/
static void task_start(void *pdata)
{
uint8_t err = 0;
//载入世界
world_load();
//设置背景色
GUI_SetBkColor(0xb07c17);
GUI_Clear();
GUI_SetColor(GUI_BLACK);
//新建邮箱
Semaphore = OSMboxCreate((void *)0);
//创建内存分区
Buffer_Ptr = OSMemCreate(Buffer,10,30,&err);
//新建任务
OSTaskCreate(task1,(void *)0,Task1_Stk + TASK_STK_SIZE - 1,11);
OSTaskCreate(task2,(void *)0,Task2_Stk + TASK_STK_SIZE - 1,12);
while(1)
{
OSTimeDlyHMSM(0,0,3,0);
}
}
static void task1(void *pdata)
{
char str[30] = {0};
uint8_t err = 0;
uint8_t *mail;
while(1)
{
//请求信号量
mail = OSMboxPend(Semaphore,0,&err);
//显示
sprintf(str,"task1 receive:%d,%d,%d",mail[0],mail[1],mail[2]);
GUI_DispStringHCenterAt(str, 120, 40);
//显示
sprintf(str,"task1 time:%ds",OSTimeGet());
GUI_DispStringHCenterAt(str, 120, 5);
WM_Exec();
OSTimeDlyHMSM(0,0,1,0);
}
}
static void task2(void *pdata)
{
char str[30] = {0};
uint8_t err = 0;
uint8_t *ptr;
static uint8_t a = 0;
while(1)
{
//请求内存分区
ptr = OSMemGet(Buffer_Ptr,&err);
//赋值
ptr[0] = a++;
ptr[1] = a++;
ptr[2] = a++;
//用邮箱发送
OSMboxPost(Semaphore,ptr);
//释放内存分区
OSMemPut(Buffer_Ptr,ptr);
//显示
sprintf(str,"task2 time:%ds",OSTimeGet());
GUI_DispStringHCenterAt(str, 120, 20);
WM_Exec();
OSTimeDlyHMSM(0,0,3,0);
}
}
上一篇:ucos-ii示例1:新建任务
下一篇:ucos-ii示例5:消息队列测试
推荐阅读
史海拾趣
关于晶体管水位自动控制电路,网友们可能会提出多种问题,这些问题可能涉及电路的工作原理、设计细节、实际应用中的挑战以及故障排除等方面。以下是一些可能的问题及相应的回答:
问题1: 晶体管水位自动控制电路的基本工作原理是什么?
回答: 晶体管水位自动控制电路通常利用浮子开关(或水位传感器)来检测水位的变化,当水位达到预设的上下限时,浮子开关会闭合或断开,从而改变晶体管的导通状态。晶体管作为开关元件,控制着继电器(或其他负载)的通断,进而控制水泵(或其他执行机构)的启停,以实现水位的自动调节。
问题2: 如何设计电路以确保准确性和稳定性?
回答: 设计时需要考虑多个因素,包括选择合适的晶体管类型(如NPN或PNP型)、合适的电阻值以限制电流并保护晶体管、使用稳定可靠的水位传感器、以及设计合理的防抖动电路来避免误操作。此外,还需进行充分的测试和调整,确保电路在不同水位和工况下都能准确、稳定地工作。
问题3: 在实际应用中,如何避免误报警或误动作?
回答: 误报警或误动作通常是由于水位传感器的误判或电路的干扰引起的。为了避免这种情况,可以采取以下措施:一是选用高质量、高灵敏度的水位传感器;二是增加滤波电路,减少电路中的噪声和干扰;三是设置合理的延时电路,避免由于水位短暂波动而引起的误动作;四是定期对电路进行检查和维护,确保各部件工作正常。
问题4: 如何调整电路的灵敏度以适应不同的水位控制需求?
回答: 电路的灵敏度可以通过调整电阻值、改变晶体管的型号或选择不同特性的水位传感器来实现。例如,增大电阻值可以减小电路的灵敏度,使得电路对水位变化的响应更加迟缓;反之,减小电阻值则可以提高电路的灵敏度。此外,也可以根据实际需求选择不同精度的水位传感器,以满足不同的控制精度要求。
问题5: 如果电路出现故障,应该如何进行排查和修复?
回答: 当电路出现故障时,首先应检查电源是否正常供电;然后检查水位传感器是否损坏或接触不良;接着检查晶体管、电阻等元件是否损坏或焊接不良;最后检查电路连线是否正确无误。在排查过程中,可以使用万用表等工具进行电压、电流等参数的测量和分析。一旦找到故障点,就可以根据具体情况进行修复或更换元件。
eBay一直致力于创新和改革,以适应不断变化的市场环境。例如,eBay推出了“新卖家金鹰计划”,旨在通过多项专属服务扶持新卖家拓展全球市场。此外,eBay还不断更新其技术平台,提高交易效率和用户体验。这些创新和改革措施使eBay能够在竞争激烈的电子行业中保持领先地位。
在快速发展的过程中,Compact公司始终注重品牌建设和文化传承。公司通过不断提升产品质量和服务水平,树立了良好的品牌形象。同时,公司还注重培养员工的归属感和忠诚度,形成了独特的企业文化。这种文化传承不仅为公司的发展提供了强大的精神动力,还使公司在激烈的市场竞争中保持了独特的竞争力。
在技术创新的基础上,Fenfa Electronics Ltd公司开始积极拓展市场。公司高层意识到,仅仅依靠单一市场是远远不够的。因此,Fenfa团队制定了全球市场拓展战略,逐步打开了欧美、亚洲等地区的市场。在拓展过程中,公司积极与当地企业合作,深入了解当地市场需求和消费者习惯,不断优化产品和服务。通过这一系列的市场拓展策略,Fenfa Electronics Ltd公司的品牌知名度和市场份额均得到了显著提升。
进入21世纪后,随着全球电子产业的蓬勃发展,Semi-Films Division 开始积极拓展国际市场。公司参加了多个国际性的电子产品展览会,与全球各地的客户建立了联系。同时,公司还加大了对海外市场的投入,设立了多个海外办事处和代理商,为客户提供更加便捷的服务。这些举措使得 Semi-Films 的产品逐渐走向世界,成为国际知名的薄膜材料供应商。
自1947年成立以来,Etco Inc公司一直致力于电子连接技术的研发与创新。在20世纪70年代,公司成功研发出一款新型的高性能连接器,该产品凭借其卓越的性能和可靠性,迅速在汽车电子行业中占据了一席之地。这一技术突破不仅为Etco带来了可观的市场份额,还奠定了其在电子连接器领域的技术领先地位。
简单计算器 加减乘除 采用4×4键盘,分别表示0~9、+、-、×、/ 、=和清零键CL http://b13.photo.store.qq.com/ht ... 37a452545bcbb7a0b86 #include<REG51.H> #include<ABSACC.H> ...… 查看全部问答∨ |
|
本人在用Tornado调试程序时,不能在指定行设置断点,按F9断点出现在其他行,同时F10单步调试,调试器中不是按顺序运行,而是乱来,一会儿上,一会儿下,变量窗口中红色显示的变量也不是当前执行代码行改变的变量。 说明:编译下载后没有编辑程序… 查看全部问答∨ |
我RB RC口只想做普通IO口用要配置哪个寄存器.我要用到RB2,RB4,RC0,RC1,RC2,RC3,RC4,RC5 怎样配置送高低电平时才正确. C2ON = 0; OPTION = 0x02;//8分频给TIMER0,内部时钟 RBPU = 0 RBWUF = 1;//在引脚电平变化时从 ...… 查看全部问答∨ |
qing0: mov r0,#0FFH QING_GOON: MOV @R0,#0 DJNZ R0,QING_GOON RET 调用这个函数怎么返回到了0000h呢?? … 查看全部问答∨ |
|
IAR EWARM能够直接将程序下载到Flash中,但在此过程中需要使用根据源代码编译出来的sim文件。如果只有bin文件,则不能直接使用EWARM下载。然而,EWARM提供了一个可将任何二进制文件(如bin,bmp,wav等)直接链接到project中的功能;利用 ...… 查看全部问答∨ |
最近接到lm3s9b81以太网通讯工作要求; 结果使用自带的enet_lwip(demo)程序时,在屏蔽数据从寄存器读取的代码后,出现以下情况; 从地址0x40048000那块以太网寄存器地址观察:当收到一帧但没有读取(屏蔽了)macdata寄存器数据值一直变化,而且 ...… 查看全部问答∨ |
在某个原理图中看到用X5325做复位电路,但看到SI SCk SO都用到单片机的一个引脚,网上找了下他的英文资料,还是没看明白,有没有大侠给详细解释下这个芯片的用法?… 查看全部问答∨ |