OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 {4 c( ?" `8 \

+ {/ ^2 l: ]" QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ X; N: m, W$ m#include <unistd.h>4 C+ ^- _5 }" y( z' O
#include <sys/mman.h>
) p" m% q5 _* ?( I. k#include <sys/types.h>
5 }. g8 L3 I/ o7 e1 H3 k7 j#include <fcntl.h>6 V: g/ t" a  g/ ^6 t' V. V

0 r+ t, m( z( C- h5 f( M( V#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) I$ G, s& F) g; x! [

; Q; A+ Q, ?6 N. Ttypedef struct4 Q! K! }3 j4 P9 ]) W$ z  [8 Q
{
9 x3 R0 O- n7 {1 u0 E& V8 _7 K        unsigned int a;3 j, Q% r, _6 Y7 x. \9 |3 @5 [' S
        unsigned int b;
% F. I5 O: i& m+ d0 `        unsigned int packet_cout;* O: }- p8 r  q& `0 q3 H% ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 o' n; c4 X5 M2 C6 R

# q- H, s( _1 @* e0 s- C3 e# kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 i, P" k6 n' G; Z2 H1 z6 ^; eunsigned int count_copy = 0;
) d8 _/ I0 f! C0 u1 K2 }6 R4 H9 R; e+ j+ a

4 L( m# s4 W8 ?int main()5 M0 O/ d4 Y$ z  g' y1 e
{( u  m7 ]; T3 ~% i1 O: \  S6 p) h, M
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( Z. c5 s3 Q+ z        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! }6 c$ u) `7 P  D7 {5 Q
  E; l1 _7 j( ^8 |5 o( n8 o
        while(1); x' l$ }  y/ p+ X" R8 I
        {, E, k  a6 ?6 x) k% G. Y
                read_MSG_buffer(pshreRAM);
6 u) j& @" f# ?- X2 c        }               
+ A# m4 |: y0 p; Z* E}
0 M: A7 @# w; ]; \! r
: o( w0 T- m$ @1 X: T) cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 S0 N9 y- @9 f' j  p1 Y2 \
{
$ l8 S+ ~: i0 F- s( q8 S. ~        RX_MSG_PROTOCOL buf;
+ W3 f9 H! J  L2 m% a        1 f: n; u* w$ p1 Y
        buf.a = pshreRAM->a;
" ^! W7 H  {% F9 k9 Q& {0 ]& u; A        buf.b = pshreRAM->b;
0 K# n5 X: y2 R8 h        buf.packet_cout = pshreRAM->packet_cout;
. o- i  v- q# I5 p* q# i; R* C        
! U. W% C' a1 y: c. n( o0 A2 b        if(buf.packet_cout != count_copy)
! T$ U9 T2 l1 P* Q# u        {0 u+ X5 H! i. }3 _' g& k, l
                printf("a is %d\n", buf.a);
! q- }9 W% @4 U                printf("b is %d\n", buf.b);
- U- \' k1 _' A                printf("count is %d\n", buf.packet_cout);
1 D+ J; |: _( @$ R3 [$ A$ k                count_copy = buf.packet_cout;+ q' Z6 V; H" x) ], l
        }
% i2 w) Z8 q% H% {/ T        else$ ^/ t" ^& B% P* A; I, [$ ?4 q$ e
        {  g! A4 X8 E3 D& K- K
                printf("No effective message!");
) e# d, U  N+ ?  j: A5 l        }
0 ~. u3 v- `; j! O% A}
; Z2 P2 @- W3 |, N0 S3 [: D6 W9 ^( S* m, Z$ A. A3 q

& z$ q2 n5 C- N7 w$ [但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: A$ p/ M+ a) ]
使用下面代码,对内存使用了mmap函数后:# E! A, F8 C# D5 {" g& U
#include <stdio.h>4 x" x* |: |/ m9 x+ `  Y6 o
#include <unistd.h>
  l/ t7 d7 a! p; i#include <sys/mman.h>
( @$ A( o( n; \/ s#include <sys/types.h>& v# M7 l' V8 Q" D' v
#include <fcntl.h>
% o  @1 Q5 g" z( V( ^$ U% d# F
5 O8 }- s% T* P7 X#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ y3 x. q7 R% E1 K#define SHAER_RAM_SIZE         (0x20000)   0 J- d: `0 \0 I$ Q) K* y

& i9 V$ \& d' M* _5 {- utypedef struct1 F; r' N1 F2 p5 k1 N
{
1 Y& I6 ?" q& k3 l' T/ _9 @- s        unsigned int a;
$ X! E1 p: p' T2 P6 C9 n- w3 \5 {        unsigned int b;* r/ b# Y) L5 `# e) g! m
        unsigned int packet_cout;0 v2 K8 H7 _% g9 k! o3 l
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 v3 V- f* s4 w: ?8 E. g2 X* ?+ [& N( N" e+ c* s9 ?+ u
void read_MSG_buffer(int *baseaddr);2 X; c& M& R4 H
unsigned int count_copy = 0;5 `6 E" B  [3 M3 X( ?3 y

+ T) K$ V- g4 x' \$ U8 fint main()9 c" y, K' B+ x7 I5 M* ?
{
  ]3 w% `5 v- e# S3 R& }        int fd;$ S( ?* M. @1 g/ N2 Y
        int *mem = NULL;: b9 b0 X9 |" s9 {9 U' ?
% ^& |$ m% [- ^; e9 R
        if((fd = open("/dev/mem", O_RDWR)) <0)5 d$ o5 G- [  t' \6 I* g- B7 h
        {
& S. G9 q6 Y1 p: f6 S' l9 R. N                perror("open error");
/ J* ^! d$ `% c. L, n8 t- _# Y% j5 [9 ^                return -1;* R1 u5 U3 [' G' y
        }
, F8 T7 A) K/ u( O7 B! j        9 a6 `' A# D; h$ g/ N4 \( H
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);5 V' Y; U# i4 ?0 a/ y7 ~/ j& M5 K

6 E1 H4 t4 S7 w. F# G: o        while(1)' s% C- S" x9 G0 r' u7 M
        {2 k7 P: X! g( d1 R4 [5 ?
                read_MSG_buffer(mem);
6 u( r* q9 o# d3 [2 \        }                7 S; j1 x/ Q( z/ L
}! ?7 f7 p7 b! O$ c, [; e) ~

+ G/ `$ W! t* M* n: X8 \( |void read_MSG_buffer(int *baseaddr)
+ @! f) ?3 V' s8 N{+ W1 X% y& L9 q# R! e8 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;: k  R0 ?  t) I8 h4 V9 K

. N4 J9 Y$ ~* \* i: ?7 J        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
; M4 T6 D( n) y  ]+ L5 i; d+ t0 A( I& k6 M. g" K
        if(pshreRAM->packet_cout != count_copy)) _. \5 S9 g  [) L
        {5 h& H& W; v$ ?4 E3 r3 O2 j  ]/ [
                printf("a is %d\n", pshreRAM->a);
, `0 t2 _4 w3 X" Z% g+ K8 c                printf("b is %d\n", pshreRAM->b);1 C% T) X7 X; v6 @% ^% u
                printf("count is %d\n", pshreRAM->packet_cout);# U7 d& U4 |1 o1 @& U/ u% h: g2 b: v" L
                count_copy = pshreRAM->packet_cout;
' ?7 \" t0 Y, I0 A& x# X        }4 U! q4 i$ {1 w( A
        else9 A1 N5 ?$ k& G% O
        {
% B3 a2 e9 H( y$ V. v                printf("No effective message!\n");7 ^9 S- B1 p/ {; k
        }2 _$ R+ X1 ^9 K- H/ U
}* n# V8 ~* F7 A4 V/ }8 {

8 C7 k: S; d8 y% Z4 L# v没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( J" h- i2 h2 `3 p- z! ?( K
4 l* U( P+ @( q' `, \, g, L. W9 Y* v
0 X  a, }) T5 Q3 b0 Z- c( q
9 U# U- u% k- Y; ]# {) v1 `/ U; r& g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-1-30 14:32 , Processed in 0.041860 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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