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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 i! A; Y2 ]: m+ k
' ~! z1 r, S( s/ ~
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 z& k  l+ ^0 E#include <unistd.h>( _! @& O' T) f: u$ z% x) ~% L
#include <sys/mman.h>- G: x# K7 \5 i
#include <sys/types.h>
2 j8 D: t1 \3 j& O1 O, e' B#include <fcntl.h>
1 Q5 i. J. W; D" \
: }3 A5 P) f, m5 P#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) l& d, F  W% K2 h" z% R. t1 d; r
( d) k# {, |; w5 A$ M5 z1 dtypedef struct% b# L6 [+ M/ n: V# @* g
{
) n1 I# f# W( C6 w& _        unsigned int a;
1 V  a9 U% t& f9 ^3 @" t" R3 I1 J        unsigned int b;  B" q( R0 {* x5 _" K6 m7 P
        unsigned int packet_cout;
. W: z# |+ G* E- n}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  q  X9 d5 r/ W$ G( P- M/ X
- u5 t& o* ?+ y6 a& @/ d, A' L0 P
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 y% q% F0 Z. X* N: y
unsigned int count_copy = 0;: C3 ?! |: ^' ^, w: {4 a

5 r5 Y$ |% N3 `; `9 T: B
' m( n+ g" a2 O: Dint main()
  G0 N7 u6 f- [3 {5 X{) D& E% L7 Q+ H
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ C1 u! t( y; [% X* K# w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: R4 `2 {! Z$ v& H. y  b2 H( o' d2 Q8 h4 F; ]: r" E/ {* M$ n
        while(1)- B- I6 i: |4 `$ F3 _' i
        {
0 D9 L7 |* E( s  M                read_MSG_buffer(pshreRAM);
' Y6 V, Q# a" y1 S9 H        }                ) d: M) i# |% R# C6 b) r, r7 Z
}
1 E/ u' L9 k; H3 d- x/ K7 w
0 Z* |, }) O4 j: K5 V; Xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 k: g/ c) p' [
{5 O; g( B  X/ ^, g: g3 V* d& ?0 U
        RX_MSG_PROTOCOL buf;7 C9 l0 {4 L0 t( u
        
) t$ z0 E2 Z: v$ L        buf.a = pshreRAM->a;4 t5 K( t; v2 ?1 C6 ]4 Z% }
        buf.b = pshreRAM->b;
% H& l) Q8 [+ P1 @) Z7 V        buf.packet_cout = pshreRAM->packet_cout;
4 E5 r7 W8 w1 e7 Q8 ^        * v- {# l& y) U4 h
        if(buf.packet_cout != count_copy)2 I. {8 L6 G5 J0 Z/ X
        {
8 X0 v/ `# V& f' N! h                printf("a is %d\n", buf.a);9 l2 y, i" J! ?. ~8 ]# J/ Z4 ?) ?
                printf("b is %d\n", buf.b);
9 B% E" g, H  v6 x. z+ i1 m                printf("count is %d\n", buf.packet_cout);  i; J5 d$ e( Z5 e( S2 B  V( ~1 m4 N
                count_copy = buf.packet_cout;
* F3 W8 Z  M& B/ f' K. B! _        }
! s7 g/ i" W4 t, G9 A& b' G& ^" ]+ W        else4 s$ a+ r$ M0 ?7 Q6 e+ G# J$ @1 `
        {
" S3 b  c# ?4 I$ T% j3 V) ], ~! |                printf("No effective message!");
! s: I" H% A4 G* L, ]+ k        }
9 F$ S' T1 r) v3 ^}# q: c1 Y1 c, J! @' @

8 z: s/ a  [- B$ t/ V8 d. w! L8 [* P" ^) w. x% d( ?7 n0 ^  B. B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。1 Z3 L) ~0 @. b9 U, }: f. H
使用下面代码,对内存使用了mmap函数后:. i% A6 Q6 E! f) V2 [
#include <stdio.h>
$ X0 w' u* O* a#include <unistd.h>
6 z" |5 P8 @& A% ~7 Y: W#include <sys/mman.h>
; g* K  {, W! Q& k" S" C#include <sys/types.h>- l  V! Z. Z. e* m* @- f! C
#include <fcntl.h>" ], c9 h) L& a( x9 r
  f! Y/ v) H6 N+ f, {
#define SHAER_RAM_BASE_ADDR    (0x80000000): ?2 J+ V9 U( c  j3 \3 J% Z* s. a
#define SHAER_RAM_SIZE         (0x20000)   
9 d! ~5 V* A1 ]& S$ {, X' z( \; h4 p" Q! P. x1 d0 d% j" J
typedef struct8 }! v8 {( Z. p- Q# W
{8 {6 S3 T7 `8 m" w3 ~+ X5 O
        unsigned int a;; D3 W9 B3 t6 A: r; Q! |3 W
        unsigned int b;
5 Q* e3 p) c3 J0 A& y! N& D$ ?: {        unsigned int packet_cout;& v& I  O1 H% @) ]+ t& [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, \; a) \' {! C

% q6 Q; ?- c" @& o$ R4 [+ Pvoid read_MSG_buffer(int *baseaddr);6 B. C9 K  ^# X- C/ \5 l
unsigned int count_copy = 0;
! ^/ Z$ F: Z; f$ Q
5 D  K4 m. o1 e7 xint main()" p: f* X$ B, q3 @, \2 G7 B
{! F: [, k$ Y9 |2 C: d& o! a
        int fd;
# E' k/ F% ]; D4 G" L9 K* y        int *mem = NULL;
- b# L$ L; k. M& H6 y' {+ [" g! D+ F) B4 n
        if((fd = open("/dev/mem", O_RDWR)) <0)
4 W) t3 p; V7 E. N0 p6 s        {+ \. n# o' _" F& P9 J7 S3 F2 B
                perror("open error");5 E- x+ r) ~+ t0 ^' o
                return -1;
) Q" R2 K! a5 u        }4 P" r3 b4 s  y9 u/ X: c
        & X9 [9 y: o$ u! E8 \
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
5 C2 ^, F" T* u7 i$ S( p: I& x! h
& B( v! l+ x8 |/ ~7 L        while(1)
8 D' D4 u$ `3 F" U& a        {; y; S& X9 J1 O  Q& X( Q6 P/ M
                read_MSG_buffer(mem);
3 B/ b$ l, i2 c. d6 d7 e' Y        }               
* a# j# e" O2 E( P' r" b}
5 m8 W3 a' [2 ?9 w
% j4 C/ E" x3 f7 U, tvoid read_MSG_buffer(int *baseaddr)
5 N' J9 A* R! n6 _4 \  z{
  U. I/ m% J$ F9 n# k) `" k        pRX_MSG_PROTOCOL pshreRAM = NULL;
; y" ^* M, v5 h* Z" X& s; t) Q0 U
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;) t: H. f8 P0 T

. ~/ W6 I# m; t7 p        if(pshreRAM->packet_cout != count_copy); ^" n, n* @: _1 V# n9 l. y2 W
        {) ^6 _, N8 Z% I5 K9 z2 i7 h9 j
                printf("a is %d\n", pshreRAM->a);
( `8 F0 ?' p( R$ ?$ F2 h, V                printf("b is %d\n", pshreRAM->b);8 O( J9 c( M) u7 d8 W5 s: g$ \
                printf("count is %d\n", pshreRAM->packet_cout);
5 y- V1 Y& p' \- A- x                count_copy = pshreRAM->packet_cout;1 X- Y. l1 h6 n9 ^! {& x
        }
# B, D" a8 T+ @        else
1 V% a, t& k2 O& l( c        {
) U% G: I( v( \7 K, v0 @2 \9 e2 a  @                printf("No effective message!\n");) j9 f3 |: |3 N4 t- u1 w
        }
0 c& u9 S, ^5 C/ k}3 H9 h* b* i8 V+ f8 G, J

- B, D5 y) w$ z没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
1 F0 m3 K0 Z& ~9 s. F; K: x
6 X: L# j: q: }  [5 i# g# \: k+ S
0 Q$ i+ s- c( P. |5 x+ Q
$ ~, s, I% Y; l4 x2 i0 L. P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-5 08:08 , Processed in 0.039467 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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