当前位置: 首页 > 工具软件 > Atomthreads > 使用案例 >

stm8使用atomthreads项目

戴正阳
2023-12-01

最近有机会使用stm8s105c6t6做开发,好久没用八位单片机做东西了,网上搜了一下stm8的相关文档发现居然有它专属的os,马上下载了一个atomthreads1.3试用,iar打开编译就出了问题:

Error[Lc036]: no block or place matches the pattern "ro code section .text in atomport-asm-iar.o" 

找过去发现是SECTION .text:code定义的问题,但是汇编定义分段用的,具体功能我也不清楚。。。。 所以我猜要修改还得查stm8的汇编指令,就一个这么小的代码找那么不值得浪费时间,所以下载了其它atomthreads编译发现有能够编译通过的,对比发现了与atomthreads1.3的不同点就在SECTION 定义,在atomthreads1.3中修改

---SECTION .text:code

+++SECTION .near_func.text:code

编译成功

但发现iar编译成功后居然不在软件中显示ram、rom的使用量

查看ports/stm8/debug目录下面的log和map文件才能看到,map里面对每个c文件占用的ram和rom都有说明。。。。。

烧录到stm8中,串口和gpiod0均会有输出并会输出semaphore的测试信息,没有错误信息标示atomthreads正常运行起来了!


一、添加中断(有两处需要修改)

1、在ports/stm8/stm8_interrupt_vector.c中

struct interrupt_vector const _vectab[] = {
{0x82, (interrupt_handler_t)_stext}, /* reset */
{0x82, NonHandledInterrupt}, /* trap  */
{0x82, NonHandledInterrupt}, /* irq0  */
{0x82, (interrupt_handler_t)AWU_IRQHandler}, /* irq1  */
{0x82, NonHandledInterrupt}, /* irq2  */
{0x82, NonHandledInterrupt}, /* irq3  */
{0x82, NonHandledInterrupt}, /* irq4  */
{0x82, NonHandledInterrupt}, /* irq5  */
{0x82, NonHandledInterrupt}, /* irq6  */
{0x82, (interrupt_handler_t)EXTI_PORTE_IRQHandler}, /* irq7  */
{0x82, NonHandledInterrupt}, /* irq8  */
{0x82, NonHandledInterrupt}, /* irq9  */
{0x82, NonHandledInterrupt}, /* irq10 */
{0x82, (interrupt_handler_t)TIM1_SystemTickISR}, /* irq11 */
{0x82, NonHandledInterrupt}, /* irq12 */
{0x82, NonHandledInterrupt}, /* irq13 */
{0x82, NonHandledInterrupt}, /* irq14 */
{0x82, (interrupt_handler_t)TIM3_UPD_OVF_BRK_IRQHandler}, /* irq15 */
{0x82, (interrupt_handler_t)TIM3_CAP_COM_IRQHandler}, /* irq16 */
{0x82, NonHandledInterrupt}, /* irq17 */
{0x82, NonHandledInterrupt}, /* irq18 */
{0x82, NonHandledInterrupt}, /* irq19 */
{0x82, NonHandledInterrupt}, /* irq20 */
{0x82, NonHandledInterrupt}, /* irq21 */
{0x82, (interrupt_handler_t)ADC1_IRQHandler}, /* irq22 */
{0x82, NonHandledInterrupt}, /* irq23 */
{0x82, NonHandledInterrupt}, /* irq24 */
{0x82, NonHandledInterrupt}, /* irq25 */
{0x82, NonHandledInterrupt}, /* irq26 */
{0x82, NonHandledInterrupt}, /* irq27 */
{0x82, NonHandledInterrupt}, /* irq28 */
{0x82, NonHandledInterrupt}, /* irq29 */
};

2、

#if defined(__IAR_SYSTEMS_ICC__)
#pragma vector = 3 //datasheet中的中断号+2
#endif
INTERRUPT void AWU_IRQHandler (void)
#if defined(__RCSTM8__)
interrupt 1 //datasheet中的中断号
#endif
{
  /* Clear AWU peripheral pending bit */
  AWU_GetFlagStatus();
}


二、驱动修改

atomthreads中的驱动很少,只有clk、gpio、itc、tim1和uart2的驱动,实在无法完成工作。我就将需要的驱动从stm8固件库拷贝过来加入工程,需要修改一下头文件,不过很简单这里就不细说了

三、总结

最后我使用了两个线程,一个运行fft,一个现实数码管,fft速度慢的可以20多毫秒才能完成一次32点的计算,其中还把sin、cos采用查表方法处理了。。。。

 类似资料: