[video member=miotatsu stream_platform=twitch project=riscy title="Fun with Pointers & Printing" vod_platform=youtube id=ehPrF_R0EXY annotator=Miblo]
[0:19][Recap and set the stage for the day]
[0:45][Consult DrewatSiFive's reply to the forum post[ref
    site="SiFive Forums"
    page="Lots of Questions… (RISCY BUSINESS Day 21)"
    url=https://forums.sifive.com/t/lots-of-questions-riscy-business-day-21/434]][:research]
[3:27][Pointer assignment[ref
    site="SiFive Forums"
    page="Lots of Questions… (RISCY BUSINESS Day 21)"
    url=https://forums.sifive.com/t/lots-of-questions-riscy-business-day-21/434]][:research]
[8:46][The Privileged spec is up in the air[ref
    site="SiFive Forums"
    page="Lots of Questions… (RISCY BUSINESS Day 21)"
    url=https://forums.sifive.com/t/lots-of-questions-riscy-business-day-21/434]]
[9:46][printf[ref
    site="SiFive Forums"
    page="Lots of Questions… (RISCY BUSINESS Day 21)"
    url=https://forums.sifive.com/t/lots-of-questions-riscy-business-day-21/434]]
[12:20][:Run the hello world program to determine that we have a working printf()]
[13:17][@hossein1387][Yeah, it works for me too. Magic]
[13:33][Fix up the *config_string assignment in print_instructions()]
[16:45][Consult man 3 fflush and man 2 write][:research]
[18:43][Comment out the fflush(), make clean, compile and upload]
[19:33][:Run our demo_gpio.c program and view the output]
[20:38][Change the printf() to print a string]
[24:29][:Run and see no output]
[25:22][Compare the difference between printf() in gpio_demo.c and in hello.c][:research]
[26:46][Compare the Makefiles]
[27:26][@hossein1387][Can you try to clean your env? Because it works for me]
[27:50][Run make software_clean and remove the fflush()]
[28:45][:Run the program to see inconsistent writing]
[29:34][@hossein1387][I tried this in beginning of print_instructions(): unsigned char * ConfigString = (unsigned char*)*(volatile uint32_t *) 0x0000100C; printf("%s", ConfigString);]
[30:40][Consult man 3 printf]
[31:51][Make printf() print the address of config_string]
[32:37][:Run our program and view the output]
[34:51][Note how inconsistent the writing is]
[35:39][Consult man 3 printf again]
[37:53][Try casting config_string to void*]
[39:40][:Run our program and receive the same address]
[40:02][Set config_string without casting]
[40:50][:Run and receive the 0x100c address we were expecting]
[42:26][Set config_string with the cast again]
[44:00][:Run our program to see our output, with a few words on pointer dereferencing]
[45:20][Remember switching the jumper[ref
    site="SiFive Forums"
    page="Arch Linux and the HiFive1"
    url=https://forums.sifive.com/t/arch-linux-and-the-hifive1/212]]
[47:46][:Run and view our output]
[48:02][Try to make print_instructions() write out the config_string using write()]
[48:41][:Run the program and view our correct config_string output, with a few words on where we got the config_string location]
[50:11][Try printing from 0x00020004]
[53:35][:Run the program to see nothing at that memory location]
[54:18][Consult the Pinout diagram in the Getting Started Guide[ref
    site="SiFive Developers"
    page="SiFive HiFive1 Getting Started Guide"
    url=https://static.dev.sifive.com/dev-kits/hifive1/hifive1-getting-started-v1.0.2.pdf]][:research]
[57:51][Read about the HiFive1 Boot Sequence[ref
    site="SiFive Developers"
    page="SiFive HiFive1 Getting Started Guide"
    url=https://static.dev.sifive.com/dev-kits/hifive1/hifive1-getting-started-v1.0.2.pdf]][:research]
[59:43][Read about OTP Contents[ref
    site="SiFive Developers"
    page="SiFive HiFive1 Getting Started Guide"
    url=https://static.dev.sifive.com/dev-kits/hifive1/hifive1-getting-started-v1.0.2.pdf]][:research]
[1:02:29][Try to print the Board Identifier]
[1:05:35][:Run our program and see garbage output]
[1:06:02][Try to verify that 0x100C prints]
[1:07:44][:Run the program to see that it worked, and determine that the Board Identifier is not a string]
[1:09:41][Try to printf() the board_id as an unsigned int]
[1:12:20][:Run our program to see some output]
[1:13:16][Try to printf() the board_id as a char, cast to an int]
[1:14:20][:Run the program and hit a trap]
[1:15:06][@hossein1387][It's a trap!]
[1:15:11][Try to print the board_id as an int, cast to an int]
[1:15:45][:Run the program and hit a trap again]
[1:16:39][That's all that we have time for for today]
[1:16:53][@hossein1387][I tried to setup gdb for the board, but I got my OpenOCD all screwed up. I think gdb is very useful in these situations]
[1:18:41][Stay RISCY, everyone!]
[/video]
