OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4836|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 L' g6 R. L0 n9 z' u- K
: O9 f( a; r* i) JOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ o8 R" T( P0 P
#include <unistd.h>/ y0 Z, S! [6 R1 Z- ~5 Z* f
#include <sys/mman.h>
* S% ~3 I' X% Z4 r9 [$ V9 g( B+ X& f#include <sys/types.h>
/ f$ h6 u( v' `8 O( t1 C$ L#include <fcntl.h>0 t. i( G* Q8 j9 K

2 }" m- _  C  I. Q2 `* b#define SHAER_RAM_BASE_ADDR    (0x80000000)   ( I; t4 Y1 X! n7 v6 s/ \7 |9 K4 {

6 l' N( Y. \) @3 utypedef struct
9 N& v+ ~1 `* F3 m5 ^{
' g: {/ n& o" a6 X        unsigned int a;* {$ D2 o7 [" F+ k! ^. b. k* l
        unsigned int b;' b% B3 G5 D: {1 e& p) Y4 t  ~
        unsigned int packet_cout;
. {* s* s7 n* X, P; F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 H* v/ F  I6 J+ Q5 i  Y$ C4 s
0 X- U7 r/ S( N8 N8 ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);7 U4 |& Z2 D3 U/ c; U$ d$ {  U: I
unsigned int count_copy = 0;* M7 j# p. H2 m7 S' G6 t
/ n. p3 r. h7 P1 q/ A8 n

5 p' z) b7 o" s9 D5 ^9 k3 Yint main()- o: {' I3 `7 P" z( x4 D1 E+ q7 x
{
1 K: F  C- m/ D- l        pRX_MSG_PROTOCOL pshreRAM = NULL;/ h: Y5 r+ ^! m9 G  g" _7 ~* \
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 ~+ N; q9 k. u7 I* |! A* i

  C0 K. t& m, S3 ]        while(1)
0 n4 d* E+ K5 {# p) O2 X        {
/ Q* b; F+ V% S8 P# c: F# y6 _                read_MSG_buffer(pshreRAM);
0 e% k) J' v9 E+ _        }                # a6 t# v9 l- M: J! s; M; K/ n
}( Y5 R% T9 s1 |1 O( E
8 q: K1 a! y& n# z/ N0 ]) v6 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- G) `0 f& ?6 x5 g# `0 g{) G1 z/ I- D. }' O  U; d
        RX_MSG_PROTOCOL buf;
3 m+ q% h; Z4 J* \: Z        
2 t0 Q! Y, p  ~5 I0 _        buf.a = pshreRAM->a;0 S3 T4 ?+ j, M
        buf.b = pshreRAM->b;
8 z, K' L4 q5 K: t' }5 |7 C: w6 w        buf.packet_cout = pshreRAM->packet_cout;3 Q3 ~4 {8 v# y8 i! Y2 v) R
        
+ Z% g$ j% ?( c% }+ C        if(buf.packet_cout != count_copy)
: V$ I6 ]1 Q! I' m        {
* r2 R; X4 q9 k                printf("a is %d\n", buf.a);
  Y% }5 t- Q' h* O4 p, y7 N                printf("b is %d\n", buf.b);/ |* S1 ]$ G- L/ g) S4 P
                printf("count is %d\n", buf.packet_cout);( s* S3 R3 j6 Y, t  [1 E1 T- ]
                count_copy = buf.packet_cout;
& K5 i  i; p3 l( E        }0 A' j7 E" j- H
        else$ W% U, o' ?+ t6 D! i% j$ p/ A5 M1 P- N' Y
        {, s6 }- i/ ~% x9 K3 l
                printf("No effective message!");
3 W' l8 A" a  i1 w' g- L2 Q        }2 {8 D4 M$ X7 ^
}9 X- Z5 p/ ?6 N$ Q. E  B
0 N0 o! J# w& d7 t. k9 A

9 Q) ]; t. Q( m. W1 i  D' m但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 }, o; r1 G* N; j; H+ c- {2 n
使用下面代码,对内存使用了mmap函数后:5 _& S0 \/ E6 T7 Y. {
#include <stdio.h>
6 m6 b( ~* M0 N- a#include <unistd.h>
$ Y$ {' c. ]; F1 F9 j#include <sys/mman.h>
0 Y+ [; N( r8 b#include <sys/types.h>; Q9 W% B8 \4 [
#include <fcntl.h>8 D/ J$ }6 D1 p

, i: }* [5 d6 W6 h! @# h/ N) u#define SHAER_RAM_BASE_ADDR    (0x80000000)# m- O( C' T2 S$ z
#define SHAER_RAM_SIZE         (0x20000)   ! R4 O$ ]8 o; `0 l0 ~0 S5 c0 s0 X

6 Q  W; }( a1 x7 T. J5 M! t7 wtypedef struct
" g- D& B( |# v4 p{
- j8 B& |) P, h9 o        unsigned int a;
+ p/ v. V9 O& c5 R, T; b        unsigned int b;
  y. h: g; B. C7 _; {        unsigned int packet_cout;
2 O7 F0 ^7 F2 _" W7 Z( f( p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# f( ]0 Y6 B. a$ V) O- C
( z$ Q. o) Z- `, f; k+ nvoid read_MSG_buffer(int *baseaddr);; ~2 f, e: o* p
unsigned int count_copy = 0;
: L+ Z4 M; z* r$ _: k
3 \# |5 ?# J. d7 L0 Gint main()
* Y2 L9 s8 {! r- N( r  \{
' {8 s3 o1 Y( x' ^. _8 u+ l& b+ A" T        int fd;
" o! q& V6 x4 s% Z        int *mem = NULL;+ K+ p0 @) ^+ Z0 h6 U

1 C- e3 n8 H' V! s7 k        if((fd = open("/dev/mem", O_RDWR)) <0)& K& D! `/ w) @: `2 h4 w; u0 ]
        {
" Y( b% e: W, i/ O! H9 x( H  u                perror("open error");
/ p# ^" _/ i' G' c                return -1;
8 X) C  ?/ [6 M        }6 p5 V' V' r: r# ]7 q" V9 _
        , E( r  \2 S2 J" X7 e+ |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
3 [* y: Z& W6 z+ y: ^3 M4 Z
1 c7 z( I: Z  D' l        while(1)/ b3 y3 }7 d; d
        {
- f0 ?: ]# x0 a8 i                read_MSG_buffer(mem);* |; {: P1 ?- z) v  W6 A
        }               
$ Y. {1 S+ c. h! i. E}
+ Z. r% u  w, p: j
8 N1 J; y7 _6 B3 Hvoid read_MSG_buffer(int *baseaddr)
; g/ t# C7 n3 Q! D( d{
# G# b! K$ B( A/ @        pRX_MSG_PROTOCOL pshreRAM = NULL;( F  D; N) n0 _& a- ]2 ~# C
- E5 f' m& t- a' F# o$ w5 y
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 G8 t  M2 E3 [1 _! v  q

0 @2 }& k0 y3 w7 `1 b- ?        if(pshreRAM->packet_cout != count_copy)
7 X  c5 `8 C/ e5 Q2 b        {
! E# `% X  p  I4 F" Q! M                printf("a is %d\n", pshreRAM->a);
$ z- D/ e5 C4 J& n                printf("b is %d\n", pshreRAM->b);
$ R" f8 v( K3 \& N. c3 x0 y                printf("count is %d\n", pshreRAM->packet_cout);
+ C  |, `- b. k                count_copy = pshreRAM->packet_cout;
  B* p$ v0 ^; \8 @: U! _/ @        }1 X3 w" f. W4 q
        else
" }6 t4 W; A" f+ x0 T" }3 Y; b% x0 G- V        {
1 @+ ^5 r& T$ O' |                printf("No effective message!\n");7 M# \& |* Z: G; ]
        }. N" B5 G' O' c+ M1 ?: d% K
}
6 W7 X" f* W, I5 j+ B% p) H+ l  y7 ^
: `6 |% Y3 y6 Z( W9 D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ u; y4 z0 N3 ~; ^7 U! U% d- L4 L. Y2 u* g% J6 H0 R

2 K0 F/ s6 V& {9 {3 A5 h5 K$ X9 }7 d; t+ H
4 c: d2 k6 M/ T5 y- W. q: E; ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-7-6 02:28 , Processed in 0.037622 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表