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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 F' O" [. v: f" y% b6 I# A# Y% Y
* E& T1 B  }4 S' t
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 t5 r/ d! I! ^, M0 E#include <unistd.h>, U# ?  U: H  w- b
#include <sys/mman.h>
/ D, u$ b4 i; T#include <sys/types.h>
1 g3 @$ v2 s0 w  a#include <fcntl.h>$ K: y) i; @! n, v

8 `3 c; Q0 }/ @: j" P#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 N4 N. F8 m9 k; H
! f( |3 P: l6 W1 I7 ~
typedef struct
1 F# ^' s8 T; L. W9 V: E{; o. y: X/ G+ o8 l. J! M
        unsigned int a;
7 x. z2 V. j& \3 Y        unsigned int b;
5 h6 Z% C- b, @+ o8 C2 M        unsigned int packet_cout;
6 f* F, g8 D! H, I/ n; `) H. t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 D+ w8 |+ `& v8 l" G& C1 J6 m# n0 J: h4 r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" l' h' V  C6 d2 ]" o
unsigned int count_copy = 0;9 T) _5 t- j0 c5 _0 U# N6 ^

8 C6 j# }7 r' n! L2 u' N" |
* D( x) e( K  k' m  Gint main()
- t, D4 P$ E" W; \* w) f{
0 d9 F! g$ K5 d+ t2 v, l9 y3 q" s& J        pRX_MSG_PROTOCOL pshreRAM = NULL;" b6 h. H) X, [5 x# l5 M
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
' o" t; U1 P5 d& I$ s
. F7 N8 |; u2 e0 y+ r        while(1). f% D9 r" _- W
        {
$ g5 L1 ]* F" @' E" T/ K9 L                read_MSG_buffer(pshreRAM);
& [. ?) {$ D2 v6 B6 y        }                , I# I6 n, G9 U9 p
}
+ Q" t- f1 c8 X8 i6 |/ |' A2 g6 a  [  O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; k" f. s. S; F6 e% H, |{5 W3 z, Y  \1 [& X4 n
        RX_MSG_PROTOCOL buf;
0 U9 E" e9 S& l& d) D. y7 P        
3 L5 |+ x* t1 O; v# g  v- T1 H7 c        buf.a = pshreRAM->a;  G5 p: ^2 x9 I' a, T! e% Z
        buf.b = pshreRAM->b;
7 }) C3 U  ~" ]- Z3 O        buf.packet_cout = pshreRAM->packet_cout;6 x1 J1 b5 t4 I' L5 N3 c( \! y2 r8 j: C
        6 Z8 B1 z( H% i! X
        if(buf.packet_cout != count_copy)
" E& ~9 @8 e$ k        {
9 I9 U& f6 r5 t" h( d& S                printf("a is %d\n", buf.a);; C+ t- g8 m0 K. R+ Y; W
                printf("b is %d\n", buf.b);
( k4 D2 H+ w7 r. Z% Y" d4 C                printf("count is %d\n", buf.packet_cout);
( Y+ a8 x# U- e( |2 k9 Y% ~5 S; \                count_copy = buf.packet_cout;0 Q5 z# [; \- I/ f
        }
9 n# Y: w9 l8 P( [( e9 k5 @        else, c3 W+ O- g- ]% y% I9 I. Q
        {3 T) G& @8 C9 b) t' w  q
                printf("No effective message!");3 B0 j/ p9 ]/ c; K( D
        }$ G7 t. C& a& M6 K, A% ^
}  I/ g9 I7 D* i* `  K" P

0 e! Q! H; A( ]. C& a& n( S
" D( E( c$ X# E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。% g/ t' q& ?; j+ Y0 @" w
使用下面代码,对内存使用了mmap函数后:$ X6 V9 a! ?+ ^9 X5 _
#include <stdio.h>
* R9 X' N5 l! j' a- m#include <unistd.h>  C  J/ E2 z& k
#include <sys/mman.h>$ ^2 e2 k" i0 Y) a0 ^; e
#include <sys/types.h>
, A! p! j) ?! p! [  s#include <fcntl.h>/ C( {0 L5 |. J+ `7 \$ Z$ V

8 W2 K  f5 u5 Q: C) a#define SHAER_RAM_BASE_ADDR    (0x80000000)) [7 P2 A6 J: e8 X9 l* g% l1 _
#define SHAER_RAM_SIZE         (0x20000)   
. y% R* w) ?& T; \1 B* g
- X: }* v0 E( B& `$ _( B! D) stypedef struct
& O' s; p, i% y; s{5 z$ Y) ^7 _' s0 p1 Y
        unsigned int a;9 a& A  v& w# x5 g
        unsigned int b;
2 {: Z) i* b  ^1 {( z( l2 ]: r) o" |        unsigned int packet_cout;' l( Y1 ?+ q8 v5 ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! _" |! y- Q  }% O. o4 [6 t, C0 T0 L2 o
void read_MSG_buffer(int *baseaddr);
; a, H' `( K* x8 Q6 q4 i  @unsigned int count_copy = 0;: S$ O: \6 ~, x6 S5 T) l9 G
7 U; v3 ]8 f  Y: \& A6 ]
int main()8 D) m% b! g: Q
{
$ l5 K  K* a2 B  I5 Q        int fd;
( v* n& ~( M0 _; y/ n# q        int *mem = NULL;+ b! V  s5 T4 V2 X5 k: h: g
. t9 G. {" H' @$ ]6 h2 L
        if((fd = open("/dev/mem", O_RDWR)) <0)
: Q1 N) Z9 b2 u1 g4 P        {
: H7 ?! Z" T& m9 c                perror("open error");
1 x; U+ t2 I% L1 l! G' h; m                return -1;
3 h1 P, N$ w! c: Y2 A5 s. C6 y7 E, j: m        }
$ z  h& \5 |0 ?' V/ D" k+ u        3 _* R( z$ P/ @3 V
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& D6 y& _2 X, v, Q% m
6 J  j2 h* L" p) j/ E        while(1)
* |" @6 Y; u/ ]* o6 [        {$ y) K) z7 b8 x4 q% h  q) J+ r
                read_MSG_buffer(mem);: b9 `5 o0 B& T, ]: r) f
        }                5 e, a9 `! X0 b, R* ?
}4 P, h8 `7 e( C9 i) m* L, V
* G* Y2 j4 e( @5 i! }! `; v
void read_MSG_buffer(int *baseaddr)7 c5 i- V8 T6 d' ~# M. T1 J
{
1 u) d8 V' }4 O" Q; l8 C4 F        pRX_MSG_PROTOCOL pshreRAM = NULL;8 {  S# b3 n& N: Q9 M, v3 U5 g
' \% {! _5 s; h+ R4 ]$ {4 D
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
+ ]+ d8 @( }- j: w- b# k
% i3 L5 r  Z; \2 i8 a7 ?, O' K        if(pshreRAM->packet_cout != count_copy)# A; D' P- y, a- U. K* C# K
        {; j5 Z, S4 {0 W6 l( d
                printf("a is %d\n", pshreRAM->a);
! w6 P/ y" I1 ^. B( r0 }% s3 R                printf("b is %d\n", pshreRAM->b);
, [- F( i" u4 N6 a                printf("count is %d\n", pshreRAM->packet_cout);
( I& r) P( R  D/ Y) s. b2 x8 M% {5 B                count_copy = pshreRAM->packet_cout;
! S: {. i8 K: L& k7 {( B        }
0 A, R; U( F8 z# Z5 E1 e9 M        else
, m9 N8 b  s6 V' F! l        {1 P/ K8 I* g9 Z/ W2 \
                printf("No effective message!\n");
# R, x4 d  o: `- a) Y$ E4 |        }1 F3 C% G9 g6 }0 R, g! Y) x* s$ r+ [
}
6 V2 F0 b, Y0 f3 z
. |6 T4 l4 B+ H* x$ {1 j' ^  u没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ a0 C, C- V) \4 [! D4 d  v% T

, l% k8 ~7 C. b7 |9 L( \9 C4 R! X; e# u7 I
8 v, @) Z. D1 b0 L7 r6 q% [/ H
% E% n% v7 F; D. b) l1 J3 [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-24 17:12 , Processed in 0.043917 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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