经查看示例代码发现,main.C中代码理解如下,
int main(void)
{
/*
STM32Cube HAL library ini
tialization:
* - Configure the Flash prefetch, Flash preread and Buffer caches
* - Systick timer is configured by default as source of time base, but user
* can eventually implement his proper time base source (a general purpose
* timer for example or other time source), keeping in mind that Time base
* duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
* handled in milliseconds basis.
* - Low Level Initialization
*/
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Configure LED0 */
BSP_LED_Init(LED0);
/*UART2 init*/
UART_Init();
HAL_Delay(1000);
/*sensor layer init*/
#ifndef SENSOR_FIFO
jsensor_sys_init();
#endif
/* Initialize the BlueNRG SPI driver */
BNRG_SPI_Init();
/* Initialize the BlueNRG HCI */
HCI_Init();
/* Reset BlueNRG hardware */
BlueNRG_RST();
/* Enable Power Clock */
__HAL_RCC_PWR_CLK_ENABLE();
rtc_init();
// 任务调度初始化
dispatch_init();
//send_acc_data(NULL);
///app 准备运行
on_ready();
while(1)
{
HCI_Process();
if(Ble_conn_state) {
Ble_conn_state = BLE_NOCONNECTABLE;
}
// 任务调度
dispatch();
// if(sleep_flag == 1) {
// StopMode_Measure();
// }
}
}
代码中引入了操作系统中任务调度处理的机制。
其中dispatch_init();是调度初始化,初始化调度链表、时间相关任务、时间不相关任务等。
- void dispatch_init( void )
- {
- int i;
- for (i=0; i
- op_pool[i].next = &op_pool[i+1];
- }
- op_pool[DISPATCH_OP_POOL_SIZE-1].next = NULL;
- freeq.head = &op_pool[0];
- freeq.tail = &op_pool[DISPATCH_OP_POOL_SIZE-1];
- }
复制代码
dispatch();是任务调度,包括时间相关任务的处理(
timerq)、时间不相关任务(
mainq)的处理。
- void dispatch( void )
- {
- uint32_t more;
- dispatch_queue_t* q;
- uint32_t now;
- q = &timerq;
- do {
- more = 0;
- while (1) {
- if (q->head == NULL) {
- break;
- }
- now = current_time();
- if (LATTER_THAN(now, q->head->timestamp)) {
- dispatch_head_op(q, now);
- more = 1;
- } else {
- break;
- }
- }
- q = &mainq;
- if (q->head) {
- // not empty
- dispatch_head_op(q, 0);
- more = 1;
- }
- } while (more);
- reset_rtc();
- }
复制代码
以上函数详细处理以及调度牵扯 到的东西在STM32_Platform-1.0.3systemjumasrcdispatch.c中。基本具有了操作系统的思想,但是不具备时间片任务切换的概念。
整体来说,各个外设驱动以及处理程序添加完毕后,不同的例程仅仅是更换不同的APP.CAPP.H,
基本上主要函数是
void on_ready(void)以及一些其他的函数。
主要是准备初始化所需要使用的驱动,其次是增加相应的任务。
当然有些主要工作在终端中完成的,可能看不到明显的任务添加。
这种代码结构,具有简单的操作系统的概念,对于初学者来说是个比较容易的,操作系统入门的学习资料。