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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : C7 l6 R9 L1 [4 D' N/ R

" o' r3 a/ e: |1 j0 a# FOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ G- k4 v( V* _+ f( D
#include <unistd.h>- X  Q6 J1 @! J8 r$ X% E
#include <sys/mman.h>
3 N6 ]5 V5 S( U#include <sys/types.h>
1 m2 b. i3 u1 X* z#include <fcntl.h>
8 I2 u3 P" \7 T# n: U6 ~
; L  V$ z- F* |+ G! q+ B#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ h5 t* Y* U8 I( z
% G1 V( P! w- D* i3 X% N
typedef struct
. m( j4 z0 q" N* O6 U2 a{
3 ]3 M* u% L0 c9 \7 _9 [% P' H" L; t1 i        unsigned int a;
0 m  l. a! q* L1 M: E; W5 ?) h        unsigned int b;
. ]$ w' ?0 e  F& M        unsigned int packet_cout;- P4 e- u# d) c+ G& a+ c9 J
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 x* r' W7 ^/ d! X" f0 @: t

0 j; ]* [8 ]5 Q- d* Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
( f5 F( p0 O0 E0 H! Z  }3 Munsigned int count_copy = 0;
+ ~& T2 b- G3 P/ K2 B1 Y; V1 O3 k

; h7 F7 j" e, {int main()
- F6 f' [% G" {. g3 ~{* S, j( l/ Y. ^$ n+ \- U. a
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 m: s$ M. n+ i/ u        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
3 ?2 ^8 C! q/ }; `
4 j0 `( C7 R8 J" z/ n( R: `        while(1)
9 ?. B. q6 X$ J! G3 a4 i* [# U6 X& B        {
$ c  a. J2 D) L$ V4 `- Z                read_MSG_buffer(pshreRAM);! c/ y! T& n9 M) U- Y- p
        }               
" ]$ H5 f" n  T( X* t9 z: X) u' _}
8 V) C  K  D! J3 c; ]& f$ M
" ]% E5 A# F* w$ X1 s" rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 R/ E/ Q0 w: ^3 g{
' y! G- Y  h* P+ Q4 u9 I        RX_MSG_PROTOCOL buf;
. T* k6 B$ q4 l0 ]" z+ `        
  p! ~- G7 Y# [" `3 N  s  [# I        buf.a = pshreRAM->a;- g+ f! K1 z/ v5 f% O$ H
        buf.b = pshreRAM->b;. y  ]" H: l$ U$ A% @
        buf.packet_cout = pshreRAM->packet_cout;
, z( Z  W# v9 y* c( D4 D        . Z4 Y5 H; v% k
        if(buf.packet_cout != count_copy)% Y& p4 C5 F, \2 `# C; R: b% e
        {. n0 ]& g' S( {  f7 n
                printf("a is %d\n", buf.a);1 Q2 ]9 h/ y2 _  Q& d
                printf("b is %d\n", buf.b);7 p9 M! Z/ I5 H5 [4 o
                printf("count is %d\n", buf.packet_cout);  n& U: K8 a- x" H
                count_copy = buf.packet_cout;8 b6 U0 |. t5 U( i8 o( P
        }/ ]3 \. a' L% V9 i% N
        else
0 v& n+ l7 {0 q( F6 G. a        {
# v2 Q8 ~) t5 {2 m                printf("No effective message!");7 v9 \* Q9 ?4 E$ Q1 J
        }
% f0 S, O% ^$ F) h: p7 T* \& V}/ B, J5 o9 b. o' f* `$ F

3 `3 j  h- o8 C0 m3 X
8 g5 [" P# w  @* C但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。; F! k4 }$ X5 i6 ?' f/ k) l
使用下面代码,对内存使用了mmap函数后:0 b9 _8 l% f- V. i) P! q
#include <stdio.h>
4 ?4 _0 z. l$ q' `) y/ L. y5 L. V#include <unistd.h>, p7 N1 g, p0 F) j. r: B  j  M
#include <sys/mman.h>
8 d- q/ @) u& k6 W1 b#include <sys/types.h>* A  |* |6 y. s7 D/ F' [6 ?! _  f# o0 j
#include <fcntl.h>) A- r" t; {( d/ l$ Z  q+ D

7 S( g  n, H8 B0 l  k4 E#define SHAER_RAM_BASE_ADDR    (0x80000000)/ G: ^# v0 s1 O: x
#define SHAER_RAM_SIZE         (0x20000)   
  K' I" M  j8 U1 N) ^2 a9 R' X5 l/ Y4 z  {  e$ W
typedef struct
- ], Z5 o' ^, o/ F* C: w: p{5 p5 K, G4 F6 R4 D* b
        unsigned int a;6 f  q! y$ ~- o# a, V. F
        unsigned int b;
. F' d4 x4 P* N, u        unsigned int packet_cout;
( J, k' _7 _9 b" t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 E% a. c" `/ T+ b9 {+ n$ t, e* M, D9 H$ q$ R! J' D; S+ X+ e! a
void read_MSG_buffer(int *baseaddr);& a/ Y  ?& c- L2 g; w5 e& u! y' a2 y& _
unsigned int count_copy = 0;- ]2 i+ _; F/ n
  H) P+ R! w8 E$ j# e
int main()5 H) p  l  |1 Z: I# X
{
0 m' g& X* l2 h4 }- T; A5 x3 e        int fd;
5 e8 f7 M# P% k+ A8 L; r        int *mem = NULL;$ |* L" S$ q, C6 {* D7 w
, O/ i. B  j- B9 O* y1 M/ g
        if((fd = open("/dev/mem", O_RDWR)) <0)/ k! P  W5 V4 o+ h* g
        {
; w! Z) {1 }: Q3 e- M                perror("open error");) P- J9 W* x5 u
                return -1;  C1 g$ C) c: v
        }
. o# Y& i7 L! K! Z        5 J# D4 U7 Q. N* ^( a
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  F9 M! s- l) K; H$ |( {6 Z4 `5 M+ p0 ^4 Y
        while(1)
$ V& {/ @% o( T. L, h" w        {: O; s- [2 d9 _, N
                read_MSG_buffer(mem);
/ B3 \: b1 E, P4 C3 M        }               
8 g9 N! u; h0 K$ K' |6 x) {: m0 e}9 l& m9 O4 |8 ^$ N* r
2 f- P4 p* M& w4 f) P; O4 u4 _
void read_MSG_buffer(int *baseaddr), z. Z0 d; Y+ K4 h4 q) T
{* ~% Y8 G8 N; A1 _
        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 H! @3 `! i8 |5 H6 [
/ _; W( Y$ t8 x9 u, y4 @4 {7 G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# Q2 X  t  ^8 [2 O; ~
2 ~  j6 d/ s* P" L8 ^% [        if(pshreRAM->packet_cout != count_copy)
' H+ x, k1 p# H9 y* h        {; h! v9 Q+ q2 k' u# }
                printf("a is %d\n", pshreRAM->a);; O3 w5 P9 R) m
                printf("b is %d\n", pshreRAM->b);
$ j6 f  x; K- [# t& n" m/ e                printf("count is %d\n", pshreRAM->packet_cout);0 j- L. `' N- W8 R5 ^" u& Y) D: X
                count_copy = pshreRAM->packet_cout;: X' @1 [: T. W! X7 Y8 B9 A
        }( x3 W( O2 e1 e; O9 R
        else
1 r7 _- }- V* b8 c/ `4 f/ m        {/ \6 N0 [& @; e
                printf("No effective message!\n");4 A* K. F# L( `" Z- k
        }. a4 m# d' i: v' ^! Z" L
}
  }5 z, @0 W# }$ D$ J% N1 F, j' T
7 i2 n/ V( N! q7 q  l4 H7 Z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  l1 s+ z7 l$ }9 u% k% m
7 d& Q' e, B* c1 S4 o, C1 N5 `6 Z9 @9 R

- ^8 \+ d0 k3 U: E$ p5 f+ n2 N# F$ @  Z
) ]  B, \1 X* ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-22 16:20 , Processed in 0.040275 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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