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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " ~! i) l8 E& x" {
3 ~; b. q! z/ f! M  Q+ @/ p
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 _4 d9 P: u: M0 G5 }; |: V
#include <unistd.h>1 x: o& E0 R6 `/ W8 P' i
#include <sys/mman.h>: H( w8 E9 h- O2 D) V( G/ d' M+ _
#include <sys/types.h>  ^$ s" f; I$ b. t7 L6 c& Q/ G- B
#include <fcntl.h>
# w( P; d$ [6 G) _
; v$ G# B# |6 p  U6 ^#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, j3 a5 j. l! s" }4 ]5 P# `6 c7 f: d) _
typedef struct0 K, L: u5 y4 Q
{
6 `0 Y$ n8 }6 k! t) b. F        unsigned int a;2 T! t4 z$ e; U: S+ c% ?  s
        unsigned int b;
/ V( l8 z# O8 `  }0 S9 i3 w  k        unsigned int packet_cout;5 b, M: t& [& z, Z: E; q$ G6 T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 C' u6 P) }- b# I! [+ {

9 y# y7 x5 j9 ^& Z! J3 b# Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# F+ k. X1 x4 ounsigned int count_copy = 0;0 A! b8 K9 l: V6 E9 ~) t' D" c
4 B: C7 I* B; M
* J& C. n6 s. A( a/ }
int main()  T: k+ D. v2 d" d5 s; P( g& S( S
{
4 }. B, R# W7 Y2 w2 C4 o7 d( C! M        pRX_MSG_PROTOCOL pshreRAM = NULL;3 r3 s9 ?- y. G6 Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;: u, q& G* v# f+ W5 ]* u

5 T) P% C( ]) A        while(1)
7 [1 ?* k7 [% ]$ [) {        {
8 X( h6 |4 ?( s, U& A" ], }                read_MSG_buffer(pshreRAM);0 q2 F( H6 w( D1 F/ s6 U. e+ Z
        }                4 m. R1 i; c$ @
}
2 c$ D) ?; p0 h8 C$ _, B/ _8 R1 p. r3 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# v7 B( z) ?  G6 j{
( e* z' ]7 k# L4 I& d1 n) ]6 x8 c        RX_MSG_PROTOCOL buf;$ C: t3 h4 s5 c( Q) O! b
        
1 x! H( |9 ]% m: K. Q5 |$ g+ C        buf.a = pshreRAM->a;. {0 P$ V9 |- n! a6 U4 D
        buf.b = pshreRAM->b;
3 t5 q9 M6 Q0 v$ Z9 {2 o9 J5 y        buf.packet_cout = pshreRAM->packet_cout;; F" u  r; q4 ]6 s
        ( s. K" H6 r" [
        if(buf.packet_cout != count_copy)
1 ], g& K4 Y) a( p- j. e4 S        {
7 s2 I. K$ s: i; T5 Q' S  d2 z                printf("a is %d\n", buf.a);
( S, V5 r. n" {/ z! q* o                printf("b is %d\n", buf.b);
. L' C6 b2 q' T* p, M, E                printf("count is %d\n", buf.packet_cout);
1 Z) O1 A) j- P4 M# N9 t2 B                count_copy = buf.packet_cout;7 l) G) e0 a+ |. u, M3 s) Y
        }
7 a; m0 D! a4 Q. H6 g4 V        else
' r+ q  C7 W6 w" ?! j. ^2 d        {/ k# [$ ]  K" F
                printf("No effective message!");
& Z+ K5 R/ k( ]8 j+ ?9 C3 f        }
) r% i: Y; o# \( h1 p; \}
. V7 l: f" Z4 v* Y, [4 `" E& S; o; L8 z( r9 X+ J, |- Z

6 l& L5 C, e  m% o/ p但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 a1 I2 u1 K) [7 t使用下面代码,对内存使用了mmap函数后:3 D3 e) m/ W- R; X
#include <stdio.h>9 x0 |) t$ R/ p5 i
#include <unistd.h>" H0 d- P. u9 J
#include <sys/mman.h>
7 `4 W# w$ O" A2 R+ T. I" t! l# f0 U#include <sys/types.h>' L% L; b0 d% h) K
#include <fcntl.h>% q4 S$ N& U2 [: p; z
! i4 Y2 O$ S) B- k- F
#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 J* O% o" W: n#define SHAER_RAM_SIZE         (0x20000)   
( Y7 a# [  p* r+ q1 `+ L5 r* Y! z
1 n: _2 K" e' \+ D! E$ [7 ^typedef struct; e: p7 g* @6 n5 o+ c' u5 C
{
+ y3 X( y' ?/ X+ p) s0 e        unsigned int a;, X) E4 d4 E  w1 S( v1 N
        unsigned int b;
" C2 \7 A& W) C1 b) x        unsigned int packet_cout;4 `8 x: [0 F1 D; p
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 x1 e+ H( G* \$ x/ ?
. y, m3 r9 h8 v. b1 p6 Kvoid read_MSG_buffer(int *baseaddr);
; Y. Q; {' c5 d: O. ]) ]! iunsigned int count_copy = 0;
" y" }& ?4 x' |  M: K: v, o$ h! O2 y+ E  `5 `
int main()
8 I* n5 O# u  X; j; G4 T/ N{0 e' }8 ~# U7 O7 w8 [, T
        int fd;5 @7 `  |' G+ n0 X( I0 ?6 |
        int *mem = NULL;( G/ F3 E0 T" r/ a

( Y- z, w$ c7 R' ]6 [        if((fd = open("/dev/mem", O_RDWR)) <0)2 K  R" o# h" @- E
        {0 M1 F4 n) k) [. v8 k6 O8 ]
                perror("open error");. _( E/ C% M! r* |7 L! E
                return -1;- Y7 I' \4 _8 K. X7 Y0 o8 Q
        }
$ Z' Q& v. F8 [8 X5 s        
! o$ ]- P0 e3 ~9 h/ h$ l9 f+ y+ ~; G        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 {- I* Q- M7 t# A' {3 `! L

6 O* M8 u1 Z' A        while(1)
0 P! @6 v4 Q1 x        {7 G+ A2 z' z$ X1 F, Z# f
                read_MSG_buffer(mem);( f6 H2 P. ^6 L7 ?- ~2 x9 Q
        }               
* `4 k+ L2 ~4 F) F* H3 L}% j) Z  D. i& W6 ~1 x" f/ Y

2 C) Q7 l* Q1 _! Z2 vvoid read_MSG_buffer(int *baseaddr)2 I1 t0 v. {5 b
{
  t0 p# f* C2 N) ]) V- k+ k6 @        pRX_MSG_PROTOCOL pshreRAM = NULL;6 H' g8 ~$ m8 w1 O! H0 [+ O: k  L

  N  Y- y( E, B* h        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) T& z) ^- ~/ Z2 }8 L
, D5 |: m* S8 X% A# q/ |% {  Y
        if(pshreRAM->packet_cout != count_copy)
& G4 v6 u$ a& G8 Q) y/ J! f  v* c5 Z$ V6 V        {
' N' W1 s) z$ V. t                printf("a is %d\n", pshreRAM->a);
' ~; w9 R9 e1 L$ l" l                printf("b is %d\n", pshreRAM->b);
8 K2 ?8 O2 a. q. U3 q8 J2 |& F                printf("count is %d\n", pshreRAM->packet_cout);
. M1 L2 A$ @9 s: D+ K0 o1 y                count_copy = pshreRAM->packet_cout;+ O) q7 r* T  ]- v! Y
        }, Q& l$ ~/ a8 H
        else; I+ x9 S/ O# e# y: |( K: g7 z
        {
) q- H# b% f; o  q: n/ K                printf("No effective message!\n");
8 M# c( j9 o. _# @- p        }
8 x; s) z! ]3 {/ Y% A" {2 [0 C6 B$ l}
1 T% i% A! ~2 o* G& X2 C2 L* @6 N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; a( C2 S5 b. I, k5 x( ?+ t

5 r+ V7 }9 b8 Y/ Z7 R  [/ N
/ r% g" u/ ~+ H
6 s& P* E0 m6 Z4 e% o
. f: f8 K2 U9 h4 @; b$ R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 03:20 , Processed in 0.039727 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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