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

一台服务器做两个网站吗百度应用市场下载安装

一台服务器做两个网站吗,百度应用市场下载安装,太原cms建站模板,网络设计方案的组成部分嵌入式程序发开思路 一. 状态机思想(State Machine) 可以理解为用一个队列去做周期性任务,这个队列中每个任务都有对应的周期时间,且扫描队列通过定时器中断中去扫描 注意:这边定时器中断只是用作了扫描任务时间&am…

嵌入式程序发开思路

一. 状态机思想(State Machine)

可以理解为用一个队列去做周期性任务,这个队列中每个任务都有对应的周期时间,且扫描队列通过定时器中断中去扫描

注意:这边定时器中断只是用作了扫描任务时间(也可以理解为时间到了就把对应的标志位置1),并没有去执行任务,然后真正的扫描任务的程序放到主程序中去做,主程序扫描到对应程序的标志位就去执行该任务。

所以这边需要引入一个队列任务的特点结构体:

typedef struct
{uint32_t TaskTimeCount[TASK_QUEUE_SIZE];//每个任务的时间计数器uint8_t TaskCount[TASK_QUEUE_SIZE];//每个任务执行次数uint32_t TaskTimeValue[TASK_QUEUE_SIZE];//任务执行时间void (*TaskFunction[TASK_QUEUE_SIZE])(void *);//每个带有参数的任务函数指针void (*TaskFunctionNoParam[TASK_QUEUE_SIZE])(void);//每个不带参数的任务函数指针uint8_t TaskState[TASK_QUEUE_SIZE];//每个任务的状态,0表示未启用,1表示启用...
}TaskQueueStruct;

任务相关的一些状态值:

#define TASK_QUEUE_SIZE  128//用于存储任务的数量,根据实际需求进行调整
#define TASK_ADD_OK     1//任务添加成功
#define TASK_ADD_ERROR  0//任务添加失败#define TASK_REMOVE_OK  1//任务移除成功
#define TASK_REMOVE_ERROR  0//任务移除失败//任务状态枚举类型
enum
{TASK_NOT_ENABLED = 0,//任务未启用TASK_ENABLED,//任务已启用TASK_RUNNING,//任务正在运行TASK_COMPLETED,//任务已完成TASK_ERROR//任务出错
};

1.1 周期时间控制

用到的参数

#define TASK_QUEUE_SIZE  128//用于存储任务的数量,根据实际需求进行调整//任务状态枚举类型
enum
{TASK_NOT_ENABLED = 0,//任务未启用TASK_ENABLED,//任务已启用TASK_RUNNING,//任务正在运行TASK_COMPLETED,//任务已完成TASK_ERROR//任务出错
};uint32_t TaskTimeCount[TASK_QUEUE_SIZE];//每个任务的时间计数器
uint8_t TaskCount[TASK_QUEUE_SIZE];//每个任务执行次数
uint32_t TaskTimeValue[TASK_QUEUE_SIZE];//任务执行时间
uint8_t TaskState[TASK_QUEUE_SIZE];//每个任务的状态,0表示未启用,1表示启用...

这几个变量用来控制程序执行的次数以及循环的周期,我这边暂时只是做了一个周期性循环任务的程序扫描示例代码如下,如果需要单步执行或者次数执行可以用TaskQueue.TaskTimeCount[i]这个来进行控制。

void TaskQueueCycleTimeScan(void)
{for(uint8_t i = 0 ;i < TASK_QUEUE_SIZE;i++)//任务遍历{if(TaskQueue.TaskTimeCount[i]!=0 && TaskQueue.TaskState[i] == TASK_ENABLED){TaskQueue.TaskTimeCount[i]--;//任务计数器开始递减if(TaskQueue.TaskTimeCount[i] == 0)//对应任务的计数值为0时{TaskQueue.TaskCount[i]=1;//需要任务执行次数=1,当任务扫描时扫到这个变量就表示需要执行一次对应的任务了TaskQueue.TaskTimeCount[i] = TaskQueue.TaskTimeValue[i];//任务计数器重新赋值}}}
}

然后这个程序因为需要严格控制时间周期,所以我把它丢到了定时器中断中去做,定时器的周期我定的时1ms进一次中断,因为用的HAL库编程所以是1ms调用一次回调函数。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2)//判断是不是TIM2进的中断{TaskQueueCycleTimeScan();//扫描队列中的函数的时间}
}

1.2 周期任务控制

用到的参数

#define TASK_QUEUE_SIZE  128//用于存储任务的数量,根据实际需求进行调整//任务状态枚举类型
enum
{TASK_NOT_ENABLED = 0,//任务未启用TASK_ENABLED,//任务已启用TASK_RUNNING,//任务正在运行TASK_COMPLETED,//任务已完成TASK_ERROR//任务出错
};uint8_t TaskCount[TASK_QUEUE_SIZE];//每个任务执行次数
void (*TaskFunction[TASK_QUEUE_SIZE])(void *);//每个带有参数的任务函数指针
void (*TaskFunctionNoParam[TASK_QUEUE_SIZE])(void);//每个不带参数的任务函数指针
uint8_t TaskState[TASK_QUEUE_SIZE];//每个任务的状态,0表示未启用,1表示启用...

这些变量用来任务队列的周期执行,我这边只是做了无参数的任务执行方式,如果任务需要传入参数,可以使用 void (*TaskFunction[TASK_QUEUE_SIZE])(void *);//每个带有参数的任务函数指针这个来做任务,传入的参数这边虽然是一个无符号的指针作为参数,但是可以用强制类型转换来变,或者你要加入多个参数,就可以使用结构体来定义参数,然后把这个void*强制转换成结构体类型的参数这样就可以传入多个参数了。

void TaskQueueCycleScan(void)
{for(uint8_t i = 0 ;i < TASK_QUEUE_SIZE;i++)//遍历任务{if(TaskQueue.TaskCount[i] !=0 && TaskQueue.TaskState[i] == TASK_ENABLED)//找到要执行的任务{TaskQueue.TaskCount[i] = 0;//重新把执行次数清零if(TaskQueue.TaskFunctionNoParam[i] != NULL){TaskQueue.TaskFunctionNoParam[i]();//执行任务}}}
}

上面这部分任务队列的周期执行程序需要放到主程序或死循环中去做

  while (1){TaskQueueCycleScan();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

这样主程序中只需要去扫描任务就好了。

1.3 任务添加

我这边暂时只是做了无形参的函数用作任务的添加,有形参的需要额外去写,这边传入的参数uint16_t TaskTime表示任务执行的周期时间,因为定时器中断我采用了1ms进一次的操作,所以这边给多少就是多少ms执行一次

uint8_t TaskQueueAddTask_NoParam(void (*TaskFunction)(void),uint16_t TaskTime,uint8_t TaskState)
{//遍历任务队列,查找空闲位置for(uint8_t i = 0;i<TASK_QUEUE_SIZE;i++){if(TaskQueue.TaskFunction[i] == NULL && TaskQueue.TaskFunctionNoParam[i] == NULL && TaskQueue.TaskState[i] == TASK_NOT_ENABLED){TaskQueue.TaskFunctionNoParam[i] = TaskFunction;//将任务函数指针赋值给任务队列TaskQueue.TaskTimeCount[i] = TaskTime;//给与任务时间TaskQueue.TaskTimeValue[i] = TaskTime;//记录任务所需要的时间方便下次使用TaskQueue.TaskState[i] = TaskState;//任务状态置为启用return TASK_ADD_OK;//任务添加成功}}return TASK_ADD_ERROR;//任务添加失败
}

1.4 任务删除

任务删除其实和初始化有点类似,只不过这边需要找到对应的程序,我这边还是只做了无形参的任务删除函数

uint8_t TaskQueueRemoveTask_NoParam(void (*TaskFunction)(void))
{//遍历任务队列,查找要删除的任务for(uint8_t i = 0;i<TASK_QUEUE_SIZE;i++){if(TaskQueue.TaskFunctionNoParam[i] == TaskFunction && TaskQueue.TaskState[i] == TASK_ENABLED){TaskQueue.TaskTimeCount[i] = 0;//任务时间计数器清零TaskQueue.TaskCount[i] = 0;//任务执行次数清零TaskQueue.TaskTimeValue[i] = 0;//任务时间值清零TaskQueue.TaskFunction[i] = NULL;//清除当前位置的带参数任务TaskQueue.TaskFunctionNoParam[i] = NULL;//清除当前位置的不带参数任务TaskQueue.TaskState[i] = TASK_NOT_ENABLED;//任务状态置为未启用return TASK_REMOVE_OK;//任务删除成功}}return TASK_REMOVE_ERROR;//任务删除失败
}

1.5 简单示例

我这边做了一个简单的示例,让两个等进行不同时间间隔的闪烁

void TaskInit(void)
{TaskQueueInit();//任务队列初始化TaskQueueAddTask_NoParam(LED_Control2,1000,TASK_ENABLED);//添加LED控制任务TaskQueueAddTask_NoParam(LED_Control3,300,TASK_ENABLED);//添加LED控制任务
}void LED_Control2(void)//LED切换电平任务
{HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
}void LED_Control3(void)
{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
}
http://www.dtcms.com/wzjs/70534.html

相关文章:

  • 重庆做网站公司排名百度大盘指数
  • wordpress本地网站打开慢专业优化网站排名
  • 做外贸网站空间多少g怎么做推广赚钱
  • 大连网站建设设计公司外贸快车
  • 个人网站备注模板微信指数是搜索量吗
  • 重庆网站建设流程网络营销顾问是做什么的
  • 浅绿色网站模板百度推广下载安装
  • 17网站一起做网店打不开网站关键词排名优化系统
  • 什么网站可以做美食免费seo快速排名工具
  • 做社交网站的预算网站怎么推广出去
  • 网站编辑怎么样推广效果最好的平台
  • 海南海口网站开发公司seo教程seo教程
  • 邢台市应急管理局上海谷歌seo推广公司
  • wordpress怎样禁止采集信息流优化师是什么
  • 广州公司注册地址迁址网上办理seo网站查询
  • 一个空间多个php网站2020年十大关键词
  • 新乡专业做网站搜索引擎优化的主要手段
  • 温州网站推广站建设河南网站推广优化
  • 电子商务网站建设类论文怎样优化网站排名
  • 大连做网站 智域免费网络推广软件有哪些
  • 网页设计基础代码网站线上推广的渠道有哪些
  • 郑州做企业网站的专业软文发稿平台
  • 在线做数据图的网站广州网站建设公司
  • 靖江市建设局网站站长工具百度百科
  • 珠海微网站好视通视频会议app下载安装
  • 台州网站建设服务百度app免费下载安装最新版
  • 如何做网站访问量的统计软文案例200字
  • 网站如何做的有特色网络推广的方法
  • 网站建设总结 优帮云怎么做品牌推广和宣传
  • 莱芜网站建设开发公司新闻投稿平台