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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 M+ F! g' p/ Y3 l

3 F4 f7 j4 Q2 z) s4 H; L7 [OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; w; c; F5 u9 }2 b9 G5 s# Y6 X#include <unistd.h>
  d  T0 O0 F/ b& z4 t#include <sys/mman.h>) s! q5 K7 [0 b# Y( t
#include <sys/types.h>
( k0 H5 e, {5 X2 X5 P/ l#include <fcntl.h>, k4 @6 @+ w: w6 z7 f" p3 m

& ~# K3 a2 g9 _# C2 \6 v+ Z#define SHAER_RAM_BASE_ADDR    (0x80000000)   & u; U% h- }8 d, {
2 k5 {# F, _" e5 f& c% _
typedef struct
" Y5 M9 a! ^" D0 ^: Z4 c{) ^% {  r5 u! o2 h
        unsigned int a;7 |5 d& l' d1 o: o( h
        unsigned int b;6 G8 ]$ ~: r. y, c8 n3 [! a
        unsigned int packet_cout;
3 j- s6 W- x& A, H2 s}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 Y7 b* `, h8 k" G2 M: W7 i2 m/ S% t, i
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);% t& N8 Z8 m% c" I0 T9 w5 m
unsigned int count_copy = 0;( m% K2 }& m: S7 ~9 ~8 f; K

  l/ i) J/ o/ n
4 C" T% W( i- l$ rint main()
! K+ `3 R) J% e0 `0 X4 P{
- U$ J8 l" b  h% {% R; y' Z* C        pRX_MSG_PROTOCOL pshreRAM = NULL;, w7 q& S. ]( L0 S1 m7 a  z- P
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;4 T3 K- x7 i; m% ^; ?
9 {' b  ]8 H; k8 h& F7 m
        while(1)
- U" _5 Y4 U$ S2 I* R- h6 E% B        {
5 n  v4 I$ |& G1 P! _                read_MSG_buffer(pshreRAM);
, s' e* ?' `( l5 I# i7 f; i, N        }                ; ?  ^4 V5 N. T' v5 w" G
}! R4 F/ }; h# @6 M2 g9 c) g

1 A7 B# Z+ n8 m7 l1 c- q  _( vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- f& T) z5 e- k* ]* q- C6 |{
, o+ }) m' ^6 G! i% u        RX_MSG_PROTOCOL buf;
- W6 L4 u! A8 z% l7 q        ) r7 z$ k8 b, p: @' q" H
        buf.a = pshreRAM->a;
1 \' Q; i7 S+ W1 p  F5 t        buf.b = pshreRAM->b;) O$ h3 O$ a8 ?% [2 W- K
        buf.packet_cout = pshreRAM->packet_cout;
  q8 l/ [3 {; G) U$ C. r6 U        
& K1 V8 O7 w, j1 M4 F4 l! S& f) A: i        if(buf.packet_cout != count_copy)$ P6 J* Q& C5 T
        {8 S; y% G0 R4 R5 z8 Q
                printf("a is %d\n", buf.a);! {, c2 H: H9 L# x; B* B! z# B
                printf("b is %d\n", buf.b);0 O- ?% b4 h6 _# w0 K0 s0 B8 V# Z
                printf("count is %d\n", buf.packet_cout);
* y3 w# b' ^, s, x, p- G5 y                count_copy = buf.packet_cout;& E( |6 M; c4 _
        }
" P! U4 W  S6 g8 s        else! @' v* P$ O; P3 A1 a9 M$ a. B& S
        {# C! ]' e& b/ j
                printf("No effective message!");
+ V1 W  D9 Q6 U/ x, d! H        }
7 P' \' i% N4 u$ ]}
$ E3 o, Y" h' @# d' q* V' ^& K2 `8 O' ^" ]9 o. t* r3 ^$ N. y- ^6 Y

( {3 O% R; S* ?* U$ e  U但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  c0 P  x' C& B8 S# D使用下面代码,对内存使用了mmap函数后:  R2 i3 X& R3 Y
#include <stdio.h>0 ]# I; ^; O7 `4 M: P0 @
#include <unistd.h>$ E. s7 j0 M# _6 X: y! p' @
#include <sys/mman.h>
) f5 [7 ?7 N$ u5 q9 y/ D2 H#include <sys/types.h>* D1 I  p2 ]  M+ {) Y
#include <fcntl.h>
9 h7 R0 P9 C9 r; H" x- J9 z  A. d' y. a/ y% U! X. O
#define SHAER_RAM_BASE_ADDR    (0x80000000)% T& B7 L9 w- j, ^) M( D
#define SHAER_RAM_SIZE         (0x20000)   
. s: Q9 o0 D: f( u, A* ]- H- ~( g* u
typedef struct
; z# x$ h, |) Z8 A  x. n& u- U/ n% K{. c- @0 I  P1 d/ K: H
        unsigned int a;  S8 @  P- ?% {: H1 p! E, t
        unsigned int b;
& k" m4 t: d5 c        unsigned int packet_cout;
2 f; Y9 N/ J7 i4 \6 M1 v1 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; v. Y$ Q, N8 ^( A, P9 R* r+ w

  f) M; i' Y  Y! S# D6 P; ~: cvoid read_MSG_buffer(int *baseaddr);
; W+ r3 }$ B8 p$ t0 C! T7 hunsigned int count_copy = 0;* g- ]9 J& [5 {+ Z
; N- }# g/ c: t6 w2 B1 i
int main()" y7 l+ `1 ], G2 ^+ }: D( A
{
" B- f& `/ J' O3 q        int fd;* O; U8 c) m% ?& _. d) y
        int *mem = NULL;
5 g1 D' U$ I& E7 Y
* j4 I' q- D, |/ R( D$ U        if((fd = open("/dev/mem", O_RDWR)) <0)
2 P# j5 u) U; f+ R# D        {$ j) }1 D5 y" a
                perror("open error");
% e- v' z! \  a' J; v                return -1;; ~' @6 B; x) X' O- S, c5 ~
        }
; ^( b3 l4 N  y8 K/ i3 n/ `# Y9 h& F        
& J( T" R5 |: a7 d( J  x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# R  @, R& d) o8 H, k2 Y- l- \

; W* H: c" R- v2 O) n% ]- S        while(1)* t" @" H+ v! T" ~3 k3 T
        {
2 y# K' t) Y7 @9 _$ z% S$ p                read_MSG_buffer(mem);7 `1 u* ^6 f, Z5 V- r
        }                & z  b% Y# U! q2 d
}2 a; @: x0 j( P) M! e
& `' F' G7 A+ t  y: ]' R3 O
void read_MSG_buffer(int *baseaddr): I, e* l) D! f4 B. s6 l: E
{* w* M. Q4 I! [; X5 Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 y0 n8 }# Z9 T  O' _. ]: N& Q
* M, v3 c1 N5 H2 _( l        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* `2 E/ L7 I# _) ]
  a8 v7 B2 ]% C, l: l6 g4 N        if(pshreRAM->packet_cout != count_copy)
) \  n' N3 Z$ J6 b3 f        {6 H. U, U4 q9 n0 f! C
                printf("a is %d\n", pshreRAM->a);
5 R. B& W; Q9 g/ l( y1 p                printf("b is %d\n", pshreRAM->b);
5 ~+ c/ \  u' J" p9 D( e0 K4 t                printf("count is %d\n", pshreRAM->packet_cout);" a% u: A, O" s/ \
                count_copy = pshreRAM->packet_cout;# L* Y& N9 C, X- B  v; ?
        }
/ z: i" E# [' N3 ~; R) Q; g- Z        else; G% n1 m# v- w7 A
        {4 p  N  H  l3 E( {
                printf("No effective message!\n");
9 x# w& r; n" R# M/ V        }! g+ i% k% q5 Z
}
( T6 z3 \! n/ P: K1 |
, b- k: \0 n1 j- e2 b没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 f( i6 }" @7 B. q0 F: u
' b, o/ o. a) I" a
/ k8 [$ o: p2 _) r- r! k7 X5 B
1 C% J" U  I! v4 p4 N1 _$ S' z) }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-17 00:51 , Processed in 0.040995 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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