当前位置: 首页 > news >正文

网站观赏王战营

网站观赏,王战营,淘宝网站代理怎么做的,ui界面设计包括哪些内容最近在玩新唐单片机#xff0c;这个跟我之前用的51内核是一样的#xff0c;然后今天觉得跑下多任务#xff0c;自己研究了下#xff0c;跟几个同学还讨论了#xff0c;发现有些人对切换过程还不是十分明白#xff0c;所以发个文章出来。直接上代码#include MS51_16… 最近在玩新唐单片机这个跟我之前用的51内核是一样的然后今天觉得跑下多任务自己研究了下跟几个同学还讨论了发现有些人对切换过程还不是十分明白所以发个文章出来。直接上代码#include MS51_16K.h/** UART0 initial setting* include sys.c in Library for modify HIRC value to 24MHz* include uart.c in Library for UART initial setting*/ void initialize_UART0(void) {MODIFY_HIRC(HIRC_24);P06_PUSHPULL_MODE;UART_Open(24000000,UART0_Timer3,115200);ENABLE_UART0_PRINTF; }void delay_ms(unsigned int n) {unsigned int i;for(i0;in;i)_delay_(); }void Timer_ISR (void)   interrupt 17     //ISR for self wake-up timer {_push_(SFRS);clr_WKTF;                                   //clear interrupt flag_pop_(SFRS); }void initialize_Timer(void) {WKCON  0x00;                     //timer base 10k, Pre-scale  1/16//RWK  0XFF;                     //  if prescale is 0x00, never set RWK  0xffRWK  0X00;ENABLE_WKT_INTERRUPT;             // enable WKT interruptENABLE_GLOBAL_INTERRUPT;set_EIPH1_PWKTH;set_WKCON_WKTR; }#define MAX_TASKS 2       /*任务槽个数.必须和实际任务数一至*/ #define MAX_TASK_DEP 100   /*最大栈深.最低不得少于2个,保守值为12*/ unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];/*任务堆栈.*/ unsigned int task_id;    /*当前活动任务号*/ unsigned int max_task  0;unsigned char idata task_sp[MAX_TASKS];void task_switch() {task_sp[task_id]  SP;if(task_id  max_task)task_id  0;SP  task_sp[task_id]; }void task_load(unsigned int fn, int tid) {task_sp[tid]  task_stack[tid]1;task_stack[tid][0]  (unsigned int)fn  0xff;task_stack[tid][1]  (unsigned int)fn  8;max_task; }void task1() {static unsigned char i;printf(task,SP:%x\n,(int)SP);while(1){i;printf(task#1\n);delay_ms(100);task_switch();} }void task2() {static unsigned char j;while(1){j2;printf(task#2\n);delay_ms(100);task_switch();} }void switch_to(unsigned int tid) {task_id  tid;SP  task_sp[tid];return; }void main(void) {initialize_UART0();Disable_WDT_Reset_Config();printf(~~~~~~~~~~~~~~~~MainStart...\n);task_load(task1, 0);//将task1函数装入0号槽task_load(task2, 1);//将task2函数装入1号槽switch_to(0);printf(~~~~~~~~~~~~~~~~MainEnd...\n);  } 单片机运行输出代码很简单就是两个任务进行不断的切换每个任务进行相应时间的延迟。先说下第一个函数把任务函数转载到二维数组保存起来而且任务函数地址和任务的tid编号要对应。void task_load(unsigned int fn, int tid) {task_sp[tid]  task_stack[tid]1;task_stack[tid][0]  (unsigned int)fn  0xff;task_stack[tid][1]  (unsigned int)fn  8;max_task; } task_sp 用来表示任务的数组task_stack 用来保存任务函数的地址说下这行代码task_sp[tid]  task_stack[tid]1; 后面的 1 不知道大家有没有疑惑。1 简单理解就是指向了下一个位置再解剖第二个函数等下你就知道这个作用的奇特用来做任务的切换先保存之前运行的任务函数地址再改变任务id把对应任务id的函数地址赋值给SP。void task_switch() {task_sp[task_id]  SP;if(task_id  max_task)task_id  0;SP  task_sp[task_id]; } 它是妙处不是在这个函数的本身而是只有比较深入的了解函数调用的过程才明白其中的奥妙。SP 是堆栈指针用来保存当前堆栈的位置上面的函数是在进入函数的时候把当前堆栈的值保存在 stak_sp 中然后更改stak_sp 的值再赋值给SP。说如何切换吧void switch_to(unsigned int tid) {task_id  tid;SP  task_sp[tid];return; } 调用函数 switch_to(0) 之前 堆栈和PC指针是这样的调用函数 switch_to(0) 之后我们需要把PC之前的值保存在SP里面然后呢PC就开始执行switch_to函数体里面的内容。然后改变SP的值让SP的值等于需要执行函数的地址函数退出的时候PC指针又会从SP堆栈位置拿到之前保存的那个地址「实际上已经被我们修改了」去继续执行。就是通过这样不断的切换完成了多个函数交换执行。这是最基本的多任务系统代码也不是非常完整喜欢研究的同学可以再看看网上的例程。我这次用的是芯唐 MS51FB9AE 芯片。有做这方便的同学欢迎一起讨论~推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~
http://www.zqtcl.cn/news/370742/

相关文章:

  • 建设项目安监备案网站免费学生网页制作成品代码
  • wordpress默认登陆地址修改廊坊百度关键词优化怎么做
  • 免费下载策划书的网站外贸网站 域名后缀
  • 网站导航条做信息网站需要什么
  • 网站推广朋友圈文案嵩县网站建设
  • 网站建设实践考试试题app运营推广策划方案
  • django网站开发源码阿里邮箱登录
  • 机床网站建设网站关键词优化怎么做
  • 全网营销一站式推广wordpress新文章加new
  • 做网站哪个系统最安全长沙简界网络科技有限公司
  • 象山县城乡和住房建设局网站上海公司牌照最新价格
  • 复旦学霸张立勇做的网站开一个公司需要多少钱
  • 专业建设公司网站软件技术培训
  • 网站建设_聊城笑话小网站模板html
  • 智能建造师威海网站优化推广
  • 做网站如何选域名长沙房价2020最新价格
  • seo网站推广济宁一建建设集团有限公司
  • 高端大气网站设计欣赏有意思网站推荐
  • 什么网站做海宁的房产好北控京奥建设有限公司网站
  • 上海网站建设网络推广网页搜索框下记录删不掉
  • 团购网站大全做相册手机网站如何制作免费
  • 承德网站制作方案百度seo关键词排名s
  • 网站建设公司佛山国内网站推广
  • 辽宁网站制作公司潍坊网站建设维护
  • 手机网站图片切换平面图网站
  • 松岗建设网站广州网站定制开发方案
  • 东阳网站建设价格做理财的网站有哪些问题
  • 蓄电池回收网站建设wordpress cp 部署
  • cuteftp 备份网站网站制作课程介绍
  • 杭州网站搭建宁波企业官网建设