【目的】
移植tobudOS到雅特力ATF425开发板。
【硬件】
雅特力AT-START-F425 V1.0
【开发环境】
MDK5.38
【移植步聚】
1、下载tobandOS源码,https://atomgit.com/OpenAtomFoundation/TobudOS
2、使用ATF425官方库。复制一份工程中的printf工程。
3、把源码的目录复制到工程的os目录下面:
4、添加一个TOS-CONFIG的文件夹,制一个示例中的配置文件到该目录下面:
5、打开keil,新建os/arch分组,官方没有雅特力方面的资料,网上也没有相关的帖子,我查看了atf425的数据手册,他是arm-v7m\cortex-m4下面的内核,因此把他下面的库加入到arch工程分组中。把r\arch\arm\arm-v7m\cortex-m4\armcc目录下面的prot_c.c、port_s.S下面添加进去,在添加时要注意下面选所有文件,才能看到.S的文件。同时把os\arch\arm\arm-v7m\common下面所有的C文件都添加进工程分组:
6、新建kernel分组,把\kernel\core路径下所有的.c文件添加\os\kernel的工程分组中。
7、添加头文件的引用到工程中,如下图所示:
8、注释掉at32f425_int.c中的PendSV_Handler,以免跟tos的系统中重复函数。
9、atf423_init.c中加入tos_k.h,注意,有些移植的教程中是tos.h,系统升级后更改为这个文件。同时在atf425_init.c中的systick中断函数中添回心跳包:
/** * @brief this function handles systick handler. * @param none * @retval none */ void SysTick_Handler(void) { if(tos_knl_is_running()) { tos_knl_irq_enter(); tos_tick_handler(); tos_knl_irq_leave(); } }
10、编译一下,通过
如果有报错,记录钩选c99
10、编写测试代码:
k_task_t task; k_stack_t task_stack[1024]; void test_task1(void *Parameter) { while(1) { at32_led_toggle(LED2); tos_task_delay(1000); } } void test_task2(void *Parameter) { while(1) { at32_led_toggle(LED3); tos_task_delay(500); } } /** * @brief configure button exint * @param none * @retval none */ void button_exint_init(void) { exint_init_type exint_init_struct; crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE); scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0); exint_default_para_init(&exint_init_struct); exint_init_struct.line_enable = TRUE; exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT; exint_init_struct.line_select = EXINT_LINE_0; exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE; exint_init(&exint_init_struct); nvic_priority_group_config(NVIC_PRIORITY_GROUP_4); nvic_irq_enable(EXINT1_0_IRQn, 0, 0); } /** * @brief button handler function * @param none * @retval none */ void button_isr(void) { /* delay 5ms */ delay_ms(5); /* clear interrupt pending bit */ exint_flag_clear(EXINT_LINE_0); /* check input pin state */ if(SET == gpio_input_data_bit_read(USER_BUTTON_PORT, USER_BUTTON_PIN)) { if(g_speed == SLOW) g_speed = FAST; else g_speed = SLOW; } } /** * @brief exint0 interrupt handler * @param none * @retval none */ void EXINT1_0_IRQHandler(void) { button_isr(); } /** * @brief main function. * @param none * @retval none */ int main(void) { k_err_t err; system_clock_config(); at32_board_init(); button_exint_init(); tos_knl_init(); err = tos_task_create(&task, "task1", test_task1, NULL, 2, task_stack, 1024, 20); err = tos_task_create(&task, "task2", test_task1, NULL, 2, task_stack, 1024, 20); tos_knl_start();
下载到开发板后,可以看到两个灯不周期的闪。