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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# D# ^, i  }5 i
9 u1 ^# I/ G: rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>% }; c( F5 x9 O5 O+ w
#include <unistd.h>6 ^" x  r. d7 E7 O* v. `  r
#include <sys/mman.h>
2 W  t6 x+ I# K5 s- [#include <sys/types.h>
3 f/ Y7 r: ?) ~% y# X5 [8 q#include <fcntl.h>) B2 P6 I/ s; s5 Y/ [! w4 b
8 D  b5 g" G: \1 r1 l7 V& q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & d1 f1 s, k- C8 p

; _( r+ ]4 ?5 ?3 G( e( {typedef struct! }! P: Y$ v) W# Q8 A: E2 Y2 K
{
3 j2 n) T0 F4 t. |) q        unsigned int a;
8 s+ [' c/ @5 P' w        unsigned int b;
* F6 m, Y) p: M- z- k( E' a; d        unsigned int packet_cout;
) A6 w4 A8 T6 M/ \  Y" h& b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, r! A+ ?( U/ D5 K
5 n; H1 b: y, ?6 a, l+ v
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. ^- O* I$ o+ O( \% W' Hunsigned int count_copy = 0;
: P4 v2 ]; {: O, L+ [) A. f. K' B. r6 L4 W7 k# z
5 y# ^5 I6 L" }. T* m
int main()+ \# x! R; r  d8 u
{
; y5 l2 I! I7 t  |0 `        pRX_MSG_PROTOCOL pshreRAM = NULL;, v9 M/ W$ K: x' r/ N9 i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 @6 x- t1 S4 k
- p3 r; i* ~  E9 l* H        while(1)
5 h; S2 i8 m, F9 L3 a4 n+ k2 f        {/ z8 i6 x2 Z5 K" F+ ~
                read_MSG_buffer(pshreRAM);7 M* p6 `; a0 e6 G3 t7 h8 R
        }               
9 z6 l! f2 O2 n$ ?}+ m; i0 L5 J% }7 o  D
# K) G/ [$ N  @8 G
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM): Q; b" w% d: L! n
{6 a- C3 Z6 d. R+ K: U" i/ S
        RX_MSG_PROTOCOL buf;
0 g7 {& L3 ~! A$ ~; J        % E. C& _. J2 U8 h+ x! @" ?1 a
        buf.a = pshreRAM->a;
' P  k  j: P" j4 W8 T        buf.b = pshreRAM->b;2 h( g- x$ t- I- X
        buf.packet_cout = pshreRAM->packet_cout;, a( T3 {5 J2 G1 K, D* h
        
8 _' b! `6 Z1 p; Q* @        if(buf.packet_cout != count_copy)
! J6 M, x, {; Z$ e/ G% G        {
, }1 h3 Q2 T# {                printf("a is %d\n", buf.a);
& }1 {) Z7 [! h% W2 p( Q% P                printf("b is %d\n", buf.b);
: q2 Q" H0 ~7 J, @* P7 v9 m& D. U                printf("count is %d\n", buf.packet_cout);
$ k6 \( R. y1 H  }3 q4 j6 J                count_copy = buf.packet_cout;
- X1 h2 P' Q1 E: U        }! {  s; `# b4 t4 W
        else8 v6 q7 a7 K1 @0 P1 [: q- m
        {
1 j! C9 \& _4 b$ V* ~                printf("No effective message!");9 F/ D8 k! Q* s8 C
        }
3 X0 @; z4 C# |0 e6 o; L1 N; c}
: E( h$ q$ t# I5 R6 g6 C1 U2 l8 d: P  s6 `* Y! E

: i* z  t( R# j) J" W但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
) D* J5 L. o$ X# m4 ]% e& k; o使用下面代码,对内存使用了mmap函数后:2 p  Y5 _  q4 W3 j" |
#include <stdio.h>
, z% P) I  F, T* C#include <unistd.h>  Z! u- j6 x2 {: L$ a: m+ H3 Y
#include <sys/mman.h>
3 D0 p6 p8 M$ Q0 {& ^" \#include <sys/types.h>
' `; R0 N7 ]  w#include <fcntl.h>
2 U% g' m7 l* y5 {1 q  @2 _! z0 F& v! Q$ k& ~. P; p& |5 y# \, f9 }
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- T* N! O0 N0 r#define SHAER_RAM_SIZE         (0x20000)   
# [. Z# R9 m- \$ E
% o% _2 S& }, g% c7 O: q  b' Q9 P) z& Jtypedef struct' M7 }' L* k& {) {/ }
{
* F+ O# W# W0 ^2 U3 j/ @        unsigned int a;  B5 w8 J9 V+ I& n: ~% O. b& O
        unsigned int b;
8 x. h- Y/ e) \8 m        unsigned int packet_cout;
8 z7 h; f# y3 v: H4 h# R5 w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;$ k5 K9 y7 K0 x3 S9 u

% {9 X" s5 I. l8 L0 N. zvoid read_MSG_buffer(int *baseaddr);9 N% c9 ?+ F0 n8 J1 A$ h1 J
unsigned int count_copy = 0;8 [8 D0 V- z/ I% q9 K

. l7 w( l# |# e! S3 a1 Vint main()
; @) z' i* C" J7 M9 s& \{( I) W8 x7 ^# `  l
        int fd;
9 d! H2 c- U0 A$ z5 s' A; V6 n$ l        int *mem = NULL;
7 Q. P! c* h4 \. e
/ W/ p! M/ n1 r3 K5 H9 F! K0 o( }        if((fd = open("/dev/mem", O_RDWR)) <0)
5 z  C0 ^5 a4 D        {
0 X) N8 n: S  Z$ W2 z4 v5 y                perror("open error");
* _# \! z5 G" G4 Y. [0 b" X, s' d. n+ x                return -1;7 @6 T# v+ u% B1 r9 Q8 z
        }6 B4 p$ o( a! k  k
        + t3 a8 @; ^( O
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( x# l6 J& S& |+ ^+ M5 ^7 i1 k" b* [2 p7 l
        while(1)
% L/ m8 u: r2 u: H; J1 a  @: e        {
1 v" [" Y1 ^7 P0 ^% w                read_MSG_buffer(mem);
* @8 I  e& F, e; T6 S$ C        }                ' ]6 h( @0 X3 R! k2 K. x; t
}
  A! _) X( C& a0 T% {( v$ Q( X
2 a3 ]: J* m$ G1 [, T' a# R. Wvoid read_MSG_buffer(int *baseaddr)
" O/ l/ F0 R6 Q& y$ X4 ~. t5 m{
3 ^1 G" S* a/ G! w" E, y        pRX_MSG_PROTOCOL pshreRAM = NULL;
) D0 d3 g# F" j, B% g3 e9 _! b# s0 A8 _3 a" y* r/ E6 W
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* m# m  a) v  ~) x" d2 R8 h
+ i4 m3 H. p: `+ Y& y
        if(pshreRAM->packet_cout != count_copy)- r0 E- f4 E8 t+ }+ o8 H4 D5 b
        {
( ?3 L& ^8 o  E- i7 `+ y( E* A                printf("a is %d\n", pshreRAM->a);
! A( `% U- W. q                printf("b is %d\n", pshreRAM->b);7 w7 I! e, z- l$ x+ y; U  S  e
                printf("count is %d\n", pshreRAM->packet_cout);' ^; p" o8 v5 c! Y, T4 M
                count_copy = pshreRAM->packet_cout;
0 W0 p: ?# C! y1 i        }* E* D# G& }7 ]9 j# i
        else
$ [/ _8 R. d& _. k+ n* _! L) G        {- m" y! v* z) S4 V
                printf("No effective message!\n");+ b9 m6 r' ~3 B+ N
        }% F6 u% O1 S! g: t
}, ?# e4 c" M( A* f9 r: W
' R/ L- D. a' W" j7 x
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( O3 t+ T$ `  x. o4 m5 s2 C

4 q$ {1 l+ |5 E1 A, k, h
3 }, \% m' B% z! [) a: ~3 O. \0 j+ b, ?8 l

- g2 H) W) Y& y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 09:02 , Processed in 0.044506 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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