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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' ?: ^6 p: |; A1 w% I$ M7 `5 D# s  Q2 J& |1 y: V" X% K
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& B2 p" S) j  c) M! B4 R#include <unistd.h>/ Y9 f$ R1 C1 f% m1 E
#include <sys/mman.h>. a+ j8 u0 O3 c8 e( X6 f' L
#include <sys/types.h>
5 B+ F( t8 M/ u2 r6 z* I#include <fcntl.h>- Y/ x+ A( a4 X' }' F2 V

6 I' Z' [% }( L6 A#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 p! ^0 R: d% b% ]

0 r- j& n. q; O' z- ]3 A& b7 rtypedef struct3 u0 G) q0 ^1 Z. Y% L
{9 J: Y! v1 r5 @( U1 `- Y& P. |% E
        unsigned int a;  r1 O4 O1 o4 V) U6 u, g
        unsigned int b;
' R4 V. Q  P! j& d. d' @2 j1 g        unsigned int packet_cout;
8 W" K! ^% ]' m" d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 I* u. O, {- E. ^
9 r6 W/ f* i! D' |) lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  n) j4 N8 G7 k% r* D6 e9 ?unsigned int count_copy = 0;( r2 Q- o! m' r" L; Y9 d$ ~! _

# A& W3 ^# s! w# E. c( H
( o4 H( o, F( x4 ?int main()
2 l$ E# {  [' q! E+ f' P! \{. t4 g& g3 c/ j# H- C
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 C6 l0 d: R5 K2 J( R: i( E. n
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
4 k- l0 T0 R, i
, m) w) |# I# h  y: H6 |; N        while(1)
6 b/ _# X% {  c9 f        {( t' x8 o# n! ~! t
                read_MSG_buffer(pshreRAM);7 p% _& a5 C& }9 \% }% I5 O
        }                + g4 e( ^/ y& {- ]) b9 I' _
}: t$ {, ^1 |3 _: |. m" V2 y

/ M' J6 i! y3 M0 n/ j+ j$ \5 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" p# W' L! k, k{2 V1 {( W3 u8 v8 I
        RX_MSG_PROTOCOL buf;0 \- H( ^4 S4 e8 ]
        - Z; O1 ]4 i* |# i% o, L' }
        buf.a = pshreRAM->a;
0 w: i+ ?  q# s        buf.b = pshreRAM->b;6 k( `* P) ?. E. X& t
        buf.packet_cout = pshreRAM->packet_cout;
6 i, u+ u" P) [! k3 n; p* J  E        1 d  c+ ]$ V' {8 t
        if(buf.packet_cout != count_copy)% ~. r- R, A/ M6 T0 }  v% z
        {9 ?1 E" p- A2 t& p
                printf("a is %d\n", buf.a);
) q0 i- d5 G: i- {  N/ X                printf("b is %d\n", buf.b);3 l( L% K( A( z; y; X1 t9 u
                printf("count is %d\n", buf.packet_cout);
6 a* s6 u- }6 j2 b: Q                count_copy = buf.packet_cout;
5 Y4 i* \1 S; N  u/ m" K* @3 K        }
1 o4 Q0 }/ Y: z& j8 X" j        else8 f6 [# O+ A- \6 Q
        {
/ n; j' V' G, Y5 g                printf("No effective message!");" o( _# a3 f- R, O
        }
2 v5 V- |' g: G}
" S) _! g" ]# R- q! x3 E
" v3 f" i7 ~8 j8 _* t8 y# G3 q" s0 C5 _( k& W- N4 h3 g% A' w- E' B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。) }3 K( w1 M* Z
使用下面代码,对内存使用了mmap函数后:1 l" k* P! u" i
#include <stdio.h>
8 Q" L7 }/ E/ {5 e' b6 E+ Z) O#include <unistd.h>
+ G7 i, l6 y) r. X#include <sys/mman.h>  ?! z1 a5 ?3 m6 N4 ^" }1 s
#include <sys/types.h>. {( M, o! T+ T2 p( R
#include <fcntl.h>+ Z/ _6 E* ]1 G2 F' `1 T, k

9 v" O" O+ J' {) S#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 O6 z  A. }; A* t" p# V1 I' U#define SHAER_RAM_SIZE         (0x20000)   ' h& V" B+ O. c
3 V2 |' C" V$ m  F9 U& n
typedef struct' j3 l" x# k) U, ~; f4 X7 F
{
2 s3 y5 z7 k. j$ v: S0 G        unsigned int a;3 d6 X1 Q- W8 R2 E% w/ c3 V
        unsigned int b;
2 F) o& U5 Y# T+ _        unsigned int packet_cout;
& [( r; N9 ?& W" ]3 W, r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
4 X6 _9 ]2 J# p1 S0 X) o' `* L1 o/ U- u
void read_MSG_buffer(int *baseaddr);$ r* S" F8 z0 j. v9 }' L5 R
unsigned int count_copy = 0;4 v! ^, M' H8 I5 g7 W
: W! C  ^" `% h, K7 r
int main()
3 c+ ]* K3 {# t! o: l{
/ ~3 h  c7 z; K! L1 m8 t9 H        int fd;
  y. r1 p( [" A4 r2 q# r        int *mem = NULL;
) v# X3 X' d  F$ w- I* ~
! l6 S. v0 ?% @, l7 t. [0 r) ]/ O        if((fd = open("/dev/mem", O_RDWR)) <0)
; c- h2 Z8 P6 L+ c# _        {
& o: {! Q" w2 D; Q  v* }" q                perror("open error");
+ N3 Z6 [: o7 j5 R# `8 d9 _& N# F                return -1;% I$ w) z' @; h, V
        }
# N% Y1 q+ N. P8 Y% \- L        
( @$ v( A: y. i! s        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 y- X1 R! q) T( n
9 \; C9 O* _9 s
        while(1)
2 ^# B7 W3 ^; t+ A        {7 s! {; D& {& E# `4 R* Z
                read_MSG_buffer(mem);
. X9 @# N2 b8 S% Z8 t; S        }               
) _& `, g' d& \}0 D3 X, G5 \$ M/ K+ K

/ d- [" ]. A) yvoid read_MSG_buffer(int *baseaddr)# a! l9 R+ t4 X' Y
{2 ^8 V% S, Q8 [+ ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;$ j5 }; S) W. @( i9 t' E
2 R  _0 X' ?6 U6 l9 q  F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;: H, f# ?3 [, L7 T

: [% @9 o( x% K* \$ H# A        if(pshreRAM->packet_cout != count_copy)
) p; j1 g% s  V/ u  w        {
8 B& M) e4 x1 i) v6 S/ y$ z                printf("a is %d\n", pshreRAM->a);' D+ Q! }+ _5 l4 [4 ?( E3 t. L
                printf("b is %d\n", pshreRAM->b);
. X% n3 s6 }0 N4 L                printf("count is %d\n", pshreRAM->packet_cout);
1 V. f; h. Q) Z: F/ r                count_copy = pshreRAM->packet_cout;
  S1 E( _% ~* l1 s        }
- Y1 g% k9 \5 p: I' m& ^. H        else7 y: I. k  {2 A! \! P4 t& u+ s: I) V
        {
8 N" y- g6 n7 R                printf("No effective message!\n");: u( a) Q4 f$ B0 U9 X
        }  Y$ D! m# T! f* N7 T" S, s2 M
}! S- q5 T! H) Y  S, ~
+ o! ^) V$ ~, b- b( g5 C, o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 Z$ Y+ k7 ~& P
" o! s" P  S  O! x- B) }  g% Q5 Y0 R6 Z, {' M

4 d. B" g5 m* i0 e! V! |/ A4 ]) [. H; f2 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-26 10:09 , Processed in 0.044531 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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