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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 D3 _7 E& L/ w% y

6 h4 p/ `6 z# k1 S& ]9 Z+ v1 lOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ A5 ^* T, V% e/ w* E& Q. u* i. t#include <unistd.h>
9 `- I9 a+ k) n1 S' c: \#include <sys/mman.h>8 Y( X$ |* g( W! @7 C: r+ |& D
#include <sys/types.h>
% f8 q7 I* x6 `3 |  o& n* H* F#include <fcntl.h>
4 R1 Z& i$ Z% `5 n  a: d! G' F4 r4 n# I+ u) w3 D: l0 M% |( Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   1 `4 J1 r$ _5 a% _" f5 W1 G

+ ?3 p2 Z( q5 b1 }) Q2 o, `4 a5 ttypedef struct
- C/ ?0 a; S+ h7 c{& Q" ^+ O5 F3 o
        unsigned int a;
6 X; k( t: V4 U# W  h$ R        unsigned int b;" Y; \, F9 E" q. |' _4 H; u
        unsigned int packet_cout;
0 Y: e; F% u! D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- }& D2 x# S, U  j# z* Z; N- a6 J3 n- ]3 e8 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: N; y0 g2 h. I- ~- w8 V
unsigned int count_copy = 0;( D! Q7 a3 j- L8 f! k/ T1 e9 s

/ V) p+ t8 t- K) i: x, K' f- s" E# o9 ]; }6 _9 H
int main()
( v0 N' @) k- o( a" X3 n$ @5 W{
4 c6 s9 s6 D! s5 i" p        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 S* W' u- W% N* k: X% U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 c( q8 C" t/ S/ w1 [

( c/ r9 [# b$ y" y# [        while(1). a# [( |7 T0 D: y7 v: w& h
        {
( k8 e8 i/ h+ z, K) H1 F4 C( \3 g: V                read_MSG_buffer(pshreRAM);+ R4 ~' b2 c6 n4 P- y7 S/ |, P
        }               
& P* K0 k* h$ P' K; {7 p9 |}
& q( P- |( {/ L" `8 v$ X9 n- R5 u9 D4 D7 w9 d! ^" A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- d3 k4 o5 h$ U$ ?5 T' `{
* e- [( a5 G' ?; r" H& y- V% v        RX_MSG_PROTOCOL buf;$ H$ l  }- z$ O* {, t
        
2 L7 }1 \: x: M0 L3 m        buf.a = pshreRAM->a;/ h3 q$ F1 C  m% O. ?0 @
        buf.b = pshreRAM->b;- L. }; r, L- }" e$ B- j
        buf.packet_cout = pshreRAM->packet_cout;
7 m: I/ O7 J5 D% m        + B+ E& a9 q5 T' f* J
        if(buf.packet_cout != count_copy)
6 t' ^" V4 D1 w) `% c! O        {4 W) {! |& E1 D6 y- ]) v; s
                printf("a is %d\n", buf.a);
) O2 y& ?0 C* Z                printf("b is %d\n", buf.b);
$ K$ E( d% b: }                printf("count is %d\n", buf.packet_cout);
4 h5 @/ L. S' @" H                count_copy = buf.packet_cout;
; e) H* g1 V9 w( N        }
( }+ D$ {; x, {# o5 j  ~" d        else2 n7 G1 f3 i; v3 H* q8 y
        {
; U( X+ A- u, z& H                printf("No effective message!");
7 v" N+ ~& B8 H+ i5 P6 p, a        }2 @5 R4 H" ?! w# s, l5 p: R/ s# V
}  i7 V; M0 _. V6 l

% _, q' _8 y9 [. q+ b# u$ Q, C! m( S+ y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。8 w; ]% s2 D6 G. L! `+ G" D
使用下面代码,对内存使用了mmap函数后:; E( n% ]  A1 o" h
#include <stdio.h>
# f& H4 `4 P! d#include <unistd.h>7 N6 F6 i+ v/ P- [+ t
#include <sys/mman.h>; n0 k/ C6 v  ?" m. H( Y$ O$ d
#include <sys/types.h>- X+ F7 u' z$ R
#include <fcntl.h>
4 v2 d6 S5 W! e; Z% f0 Z8 _
; ]0 L1 P) N* m* ?* t$ i#define SHAER_RAM_BASE_ADDR    (0x80000000)8 [) L, o+ t( R% }1 g9 L3 v/ B
#define SHAER_RAM_SIZE         (0x20000)     k8 x# n( P1 y, w+ L" R
9 l8 j. [$ c+ T0 @; u0 X7 U/ D
typedef struct5 [0 v* b. k- o& ?5 z
{8 N; Y% Z; C$ T5 P" n( M7 u
        unsigned int a;+ U: g/ n; e) s5 {3 p
        unsigned int b;
4 {! p/ ^; W/ h0 O; k        unsigned int packet_cout;: l2 t) ~# I, e; U) A1 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
* C1 @5 O& p, u0 n8 T; y+ ], ?/ ~3 D  H5 E
void read_MSG_buffer(int *baseaddr);
0 @$ C# ~2 ~8 l+ c( x$ Xunsigned int count_copy = 0;1 ?/ Q9 x% v* x

" g7 j" C. C: Y& P( H* Eint main()
! H: `6 R; `* q) c* \, [* V{
$ z+ E+ I5 V9 i& r        int fd;6 j$ o/ k2 X5 i' `( Y2 s8 n' V
        int *mem = NULL;$ s, C: P; ^# p5 t, S0 g* g# z7 v
- D" i1 u2 T  z6 w# S0 U
        if((fd = open("/dev/mem", O_RDWR)) <0)
- R  D! p3 g- M4 X  F# p        {5 ^3 l) t& c" I2 x1 l
                perror("open error");
% T/ k/ e+ X9 ^4 Q                return -1;
9 o8 a7 n$ x6 L7 O0 [        }/ M0 ^, l- X; B8 @
        
& c: z; M$ c* D0 ?- |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);: Q! W, V% s/ p' ?& m8 _3 K

' t& Y; C, P+ r        while(1)
- g5 d& |3 @7 P% J/ c0 b- h        {' [0 }/ C" T  g1 @
                read_MSG_buffer(mem);
& `+ |3 B  a# X9 m# w        }               
$ S# o# L1 {: S% ?}
+ f( U3 f' w& c. J. z+ y' W' P/ B1 @; w3 Z( s
void read_MSG_buffer(int *baseaddr)
5 B; H( I. A' U4 a; s4 B{
& ?4 n7 {4 v" z. d5 \; u        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 @- u. U( ]1 Q9 C" w% [# l5 A) C# Q: E- f0 i) M0 h
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;6 M0 x6 `# q9 O' e3 s3 @
$ Y* O- t* g( q2 q! _3 k, j
        if(pshreRAM->packet_cout != count_copy)
" t$ L% [' u. a& s6 F0 P        {
  ~5 {: j) c, F& F, U7 \                printf("a is %d\n", pshreRAM->a);' s9 M: h% f- a
                printf("b is %d\n", pshreRAM->b);% F+ d" c, |* r' }! m5 d
                printf("count is %d\n", pshreRAM->packet_cout);7 z/ A" I/ L( l& X- |$ }* o( F7 |
                count_copy = pshreRAM->packet_cout;0 g# }+ h0 E5 {
        }7 i7 h& J5 l& ]0 C% t$ N
        else( j: K8 E$ D: M% p
        {6 L' f' {( V, T+ v8 H- ~1 i! r
                printf("No effective message!\n");
. [* ^+ g/ h$ t1 F        }- B+ d1 f* s* M" l& w
}
' h7 \+ j5 P' D' Q( o, ?. m$ n" X6 f' C8 p: t, O: m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 K; D% M0 [. a; `! a' O+ N7 Y5 E1 Z
# e! X/ O9 ]6 Y2 _& r5 W: E4 G
$ N* z5 z( q4 Y8 [6 ~$ A; e. [1 d" k0 E# u8 W
2 ]( _- q) S/ ?) P' y2 l& z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 09:06 , Processed in 0.039207 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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