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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 M! Z8 @/ |) S! R% Z8 ]8 Y

8 O/ i3 D/ x5 c0 B! oOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 V( N- Y  T, }4 J& ]#include <unistd.h>9 e3 \$ x9 p& B1 |4 n8 C
#include <sys/mman.h>
$ p1 @: k5 t* I" c1 n5 V8 h#include <sys/types.h>/ Z$ J2 @6 j' d: [
#include <fcntl.h>
- N: q( O* k4 o/ h! H$ D7 H
- w1 R' Q2 Y- Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 m; Q) j" o. K; j9 g
3 Y7 H  v) h: K9 q. S+ ktypedef struct: g4 T9 i9 L/ U, |9 Y) z+ P  g
{- M  ^6 c" W4 y* w
        unsigned int a;
3 `0 B) b4 C3 R* k& l2 i- F/ m3 y        unsigned int b;
3 G6 \' v6 ^- J3 J4 b! {        unsigned int packet_cout;: \$ }: [& U) _1 ]* x8 o* c7 D3 Z& t
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% j* u  k  C9 h$ J
+ E* |  }9 i8 i! q$ L/ x; pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ f) ~' a" m6 n9 S8 cunsigned int count_copy = 0;: h" f) X4 _, K5 b+ B/ {

* e, G$ b% h- R, A( T- D( Z( Y+ R, l" y; S9 a3 T
int main(): M6 J' ^5 @. {" T4 f2 @
{
2 b9 I4 Y9 d! \0 E% _        pRX_MSG_PROTOCOL pshreRAM = NULL;8 h3 i( t: c: o
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
+ g& w$ {/ u9 ~, M8 \1 L# d" i) t! ]* P: V. |# d+ V
        while(1)
0 N+ I0 C: P; _6 L: H- p$ F        {6 _* d7 L, n  H2 `
                read_MSG_buffer(pshreRAM);, ^3 g# d* V0 t8 b1 I
        }                0 Q- {3 L' e+ F! C' b$ x4 [- h9 Z* n
}
4 }0 u1 y9 X3 W, K2 o  [' Z+ @8 T& k% `% M
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 h- t( {1 w0 z8 O. X+ N& A" z- H
{
2 z7 h, E9 p& a# i        RX_MSG_PROTOCOL buf;
) N1 Y3 R. M: ?' S        % v* v. ?7 h8 z! m6 e9 }
        buf.a = pshreRAM->a;6 _9 q/ t9 j  X0 k" k+ X
        buf.b = pshreRAM->b;
8 m' E( D9 p; G! T6 o        buf.packet_cout = pshreRAM->packet_cout;3 }6 Z  C: t" G: s4 k
        3 k3 z( X( D  g; O3 E
        if(buf.packet_cout != count_copy)
2 l* c& Y) j- w9 \7 \% W        {2 {7 H  g' i1 N& {
                printf("a is %d\n", buf.a);  }; ]* D6 J* ^
                printf("b is %d\n", buf.b);
# w8 |5 Y) X$ [7 G3 O% k8 S                printf("count is %d\n", buf.packet_cout);
3 g0 o3 q/ K7 N! Z) e                count_copy = buf.packet_cout;) A0 }) a2 n: j, G6 a$ }( g2 t
        }
$ ^& _7 n; F( h& G: g" O) t        else
0 E* ^' Q$ R. w# L7 u( o) I3 j        {7 ~1 W: V# T) p) j
                printf("No effective message!");
. A, L( J. F0 K! T6 W        }0 s( \3 [; {% ?0 ~+ P
}
1 t* E9 j# y3 r; ?& o5 h; l0 Z; n0 d" K7 t

$ m* O( t" y/ `# C* Z$ p  n7 U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 l& J( A3 x6 d# i( H; h- ~使用下面代码,对内存使用了mmap函数后:1 U/ H4 n; a* g# r
#include <stdio.h>
3 `8 M2 _: L. t( _  {2 ^#include <unistd.h>: ?, [) O8 i/ }% n% `, E9 g
#include <sys/mman.h>& }( ]) ^  b9 C) j1 i" O" K
#include <sys/types.h>( K. q. G  s' S% o9 D
#include <fcntl.h>. z/ D: X9 x3 d* k8 Q

* a, L$ d) m4 V5 O9 {# z) R, A#define SHAER_RAM_BASE_ADDR    (0x80000000)& k; k# p4 s- L, Z/ Y
#define SHAER_RAM_SIZE         (0x20000)   
3 q2 w$ Z3 j$ p7 u  ?/ L8 T- z3 c4 y5 D! M1 q+ N9 }) @1 x+ L/ _1 F
typedef struct
0 q( a4 J3 r0 s5 m' B{5 z* \. p  z+ x( o' i. t: e
        unsigned int a;6 B3 c) Q* M, _* a: v
        unsigned int b;
3 L0 ^6 [& ?7 }( R$ v3 B2 P9 o7 u  G        unsigned int packet_cout;8 B# p; o2 b- {# c/ g6 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 e5 Y5 t  f6 i0 `
  q! f' O. H  L; T3 @
void read_MSG_buffer(int *baseaddr);6 K4 E) X" v8 H
unsigned int count_copy = 0;
3 o0 q* c% h1 M  s
+ i" z- L7 h1 [: Sint main()# Y/ g: s3 _% b1 y3 z* R, w
{1 {; [4 G5 X% h9 [+ `
        int fd;8 @# V% `7 `! V4 c' g0 m' x
        int *mem = NULL;
1 I4 J8 o* |  L( Y* |" h1 s' @) i, a. V" z" O' D- h' I
        if((fd = open("/dev/mem", O_RDWR)) <0)
, x; g- O& Q3 \/ a9 K- f        {% `: ]. j2 W4 i4 J+ h9 k6 I
                perror("open error");  c: S+ O# Z0 y, Y2 a- w
                return -1;
0 m! B2 s  ^/ r7 ~        }
9 s$ S8 S( U4 Y& q7 {: V3 w, l        
% ~: b& W5 B! B( K        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 [+ \9 J. A, Y6 F- l
! l2 x' Y' }* v* H
        while(1); ^( U" y( y0 d7 g: V. _
        {6 O4 T  E9 R: I
                read_MSG_buffer(mem);
, S; x( e+ B) F9 [  a! x1 C        }               
# o3 u) i0 }8 ?% o}
+ v7 f7 y  x6 e+ _4 \+ c
, e! j( V& [+ i( Q0 U) w+ `void read_MSG_buffer(int *baseaddr)
; p+ v) S" @0 V$ K3 R, B4 i{  a/ y3 s( m* {" j3 A: `
        pRX_MSG_PROTOCOL pshreRAM = NULL;. X3 C2 k6 M, t8 M

4 ~1 z+ ]" B3 C) d, d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ n+ l& h) o, l+ w; T* [% ]" `6 K4 ^* P3 y, I* j
        if(pshreRAM->packet_cout != count_copy)
: J, p( V6 @' u! I, C0 h        {
1 l+ e# z; M" y                printf("a is %d\n", pshreRAM->a);% l7 Y- S4 S8 h7 M# F2 S* @
                printf("b is %d\n", pshreRAM->b);
& u7 A. S( o, |0 K                printf("count is %d\n", pshreRAM->packet_cout);
, K+ p1 x  W( ^' q! s, I, |8 _                count_copy = pshreRAM->packet_cout;; P; n& G. ~+ O6 a0 k1 ?
        }# k" J- N) i* N) L
        else
- x3 D  v" B) ^7 q7 }2 G        {
8 d# s3 o$ A" r" Q+ ]                printf("No effective message!\n");
& i1 ]( M+ o/ f+ r        }
+ |% P& n( k8 @( H}2 R: Z) i3 Q. f9 N6 w

4 H/ v3 V9 |4 Q9 Q( S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 N& r  J( |" L; N  c+ n
5 G" i, r# H4 m8 K

4 I- v3 q' e& p( c  \! L0 R* v& M' E$ n8 h: }( j0 S

" g: c# F! c  X& m' L0 D- u! [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-22 23:31 , Processed in 0.037880 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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