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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 8 t" i& U) _/ K# g9 t( L8 Q5 x
1 J0 n  b6 U' R5 l* [
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 ?% u2 C& Y- A$ w# `% B6 \/ v# y#include <unistd.h>; R/ X% T2 f: C  y: Z
#include <sys/mman.h>
. G4 x! N' T) \% j3 c#include <sys/types.h>
7 v" y5 i) D8 z4 Q- r! O  ?! z) w#include <fcntl.h>7 u9 ?3 N/ u' _- C( M) h

8 D1 i1 Q- ~* X! |* D% {  i, _#define SHAER_RAM_BASE_ADDR    (0x80000000)   + v) ~% _( J* J
: f) G8 t$ E7 k1 b  H$ x
typedef struct5 i5 |8 v% c: u$ n0 P& U9 d
{
: B1 \1 w# h7 q        unsigned int a;% \5 A! X  M1 K5 e/ k% u
        unsigned int b;
6 [4 a0 R4 t9 o  g, Z  k        unsigned int packet_cout;: ~& D' a4 J4 V# F! f( _- [5 K! I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; a) j) c4 \( W. q, ~

% y1 _% E% d; S* D* Q1 kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);  i& [$ C6 j$ Q% w0 F* t3 o
unsigned int count_copy = 0;& V+ q  I, c( E' w

5 i, ~% i5 f+ Y' A8 E" D/ M4 ^1 k7 S' }9 y5 w( i. p
int main()1 Y0 @, b- H8 T( @) y# ]
{
9 I  v3 |9 @$ @+ y; E        pRX_MSG_PROTOCOL pshreRAM = NULL;
( V/ w5 h: E1 G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 A6 m) |6 f! ~/ F. @. \" I% D; B0 r, U$ D4 ?$ n9 i$ q2 u
        while(1)
6 Y! d  Q+ Z; q& g- {        {
! F. h5 ]* H$ F! W+ N" ~                read_MSG_buffer(pshreRAM);
# ]* k  s! N0 b  P# Q# w        }               
, W6 l) v7 X/ ~+ ?}
, S) ]5 R8 w! O# d) _
! J( H6 a+ X3 t6 ]' ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)' m# O) e' l2 t: }
{
" k* o; ^, c. ?1 `% R2 i        RX_MSG_PROTOCOL buf;! K/ j4 t% l8 Y- a0 @0 z
        
; w1 M" K; [7 T$ }+ E: ]        buf.a = pshreRAM->a;- z" f  t% V  m3 X4 L
        buf.b = pshreRAM->b;
3 G' H5 Y& `1 y        buf.packet_cout = pshreRAM->packet_cout;
: V  {: J8 }/ J! p# t        
* y0 N5 C) d9 r% G5 ]        if(buf.packet_cout != count_copy)) ^$ e  e7 G( ~3 `0 \! O
        {
# L# c  x: H9 f/ m                printf("a is %d\n", buf.a);  ?& Z: O# K, _" o+ t
                printf("b is %d\n", buf.b);
/ _+ ]* L" m  P9 [6 D& w1 e                printf("count is %d\n", buf.packet_cout);2 E1 T" P8 Z% L9 ]0 f6 s  |* Y! c8 |
                count_copy = buf.packet_cout;
6 Y; C3 K; W4 D, U        }
. G9 n/ J+ n# ^- z% ]; ?        else
) C# \: v, S& O8 m1 {        {
5 w5 I9 t  a' t                printf("No effective message!");* v& X; _- {$ C7 j( g3 I
        }
& }# [9 S' ?% v8 B: e" |6 W}! [8 X# t0 w3 t8 g

% h% y9 L) V2 ?, _: p9 D' h. x5 b, H
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# G* k9 K8 ^3 Q* w* Z
使用下面代码,对内存使用了mmap函数后:8 ^3 r7 P( ^, ?0 v% Q0 p
#include <stdio.h>2 |' ^0 k1 N1 O: w2 ~
#include <unistd.h>
7 E" Q, Y3 T  n) S, A/ I: V#include <sys/mman.h>7 E- H9 W) E# h5 Z* j
#include <sys/types.h>
& C* x" j2 @9 a& Q#include <fcntl.h>
$ A* @% z$ {8 v7 s& A/ y7 \: `( `& V/ O3 [
#define SHAER_RAM_BASE_ADDR    (0x80000000)& T( a: i4 A! ~. ~* m- t
#define SHAER_RAM_SIZE         (0x20000)   2 A# H+ M$ z: Z# M8 r
  e( @! \! v* u2 P
typedef struct
' D6 Z/ S* c1 ]$ i4 u. T! \{
9 k+ H3 p( I; s  X1 O( i+ ]7 z        unsigned int a;$ U3 Q( S& s# V, y+ m  {" ]
        unsigned int b;" I2 ~4 y! n4 ]/ h; P: z8 A
        unsigned int packet_cout;0 z$ C- b. {0 k' J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! b: J) }" p6 r5 O9 @4 O8 ?. B
/ v8 I& b) b8 N: wvoid read_MSG_buffer(int *baseaddr);. U' K$ e! j6 Y* n
unsigned int count_copy = 0;0 c& O5 N% ~. r

+ f# G7 _% w+ @; C7 \int main()/ _* F2 C' q; E5 S0 z) c
{
  S5 Z9 w5 X4 _. l5 Q        int fd;
9 r. u* f8 {, G: I3 e2 t- m  A/ _        int *mem = NULL;
- g/ _) D( o' n8 I+ G1 L/ V! H! m% L& _- M% N
        if((fd = open("/dev/mem", O_RDWR)) <0)
) u/ I- }+ n; t9 {+ p0 ^        {
9 z6 u6 w) {% I4 w, \                perror("open error");3 n* n: W3 y  h
                return -1;+ N+ `( o9 }) x9 U
        }
( N+ B" d! c8 {; q3 L8 u6 ^        ! A0 v4 I4 c& b' G+ ~0 Q- l5 f$ S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ g* ]' ]7 }' P. o# O" N) ^$ @
' G7 q; O6 R% S  w9 T9 J6 p6 I        while(1)3 O/ g- G9 a& h& ^* ?% h$ k
        {  |- t4 R7 x2 b; w* `* Q
                read_MSG_buffer(mem);+ b. I" T) Q6 S
        }               
9 M; ^! |) r, G) g% @7 F0 b}1 e! |) F& w' H! K4 ?% ~4 x

. k/ V, |& z+ u/ ?void read_MSG_buffer(int *baseaddr)
4 D  u! ~8 v' |: @% U+ v. b{: K1 _4 U! p- \8 l* r! S
        pRX_MSG_PROTOCOL pshreRAM = NULL;7 d' L+ d% Z7 c) U5 b

0 ^; w2 N4 Y( j( U7 F+ ~+ A        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* T* N8 i/ r/ u5 d

- h; w; c2 e: s+ x6 N; F        if(pshreRAM->packet_cout != count_copy)& ^" ~! J* a0 s$ m& U; \8 k, r" n: k* h
        {
. N% o* @5 r: X  J2 t& m                printf("a is %d\n", pshreRAM->a);! l, {, u3 e2 u4 s5 d& M5 d7 v
                printf("b is %d\n", pshreRAM->b);0 k  A6 o1 Q' M! L( _2 V9 O1 k0 A
                printf("count is %d\n", pshreRAM->packet_cout);
4 U( ^$ F. p) l0 Y1 z$ Q                count_copy = pshreRAM->packet_cout;& S0 }9 Z3 y; ^# ]9 `% C
        }
0 X- _! c9 B  M, w0 F2 K2 c5 ?" I        else- X* Z1 v$ s! A
        {6 P% f6 v9 I9 E7 r: v4 g8 r- @
                printf("No effective message!\n");( K; D* N! [4 w7 Z
        }
* i( M: n4 W7 m7 |}: K$ l  [2 V+ y+ S/ w

+ I9 U- `# O" V5 [. D没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 p! g% O  G' c1 t+ g  h0 F) K- r& g1 }
" B. }% [1 @" a3 i+ h' |; i
/ j. P- o; [& `" @! P2 S- q6 i0 t. |8 V! h  o+ N8 l) I
( x7 _$ R3 D8 H4 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-10 17:00 , Processed in 0.038566 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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