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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : q) v0 z3 [4 d) J% l& I$ G( W6 s
- o/ I3 t3 S2 V
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# x; p- H# A& l# d' r) ^; u! T4 v#include <unistd.h>
- ?  A0 j5 K6 |" ]5 B( l: r+ V#include <sys/mman.h>
+ j+ U3 x' `8 F4 S" K#include <sys/types.h># x  o# I! V7 n: [3 t
#include <fcntl.h>. v; l8 I! G# n  A  z) Q

; W- n" u7 H7 O5 q3 N7 V3 i5 a#define SHAER_RAM_BASE_ADDR    (0x80000000)   # I/ R) [  V2 K/ U- |4 Z

2 o% m7 r$ n9 M3 P+ w/ d$ atypedef struct* g2 q9 R- p, A! T* u
{6 i1 G+ d' B3 `( k
        unsigned int a;% k) e8 d+ j2 H
        unsigned int b;% `* Y  m8 k3 S  v. a; g$ P$ Q
        unsigned int packet_cout;: o7 N7 L7 Q1 _# N: U, Y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( I+ ^0 ]; d% s1 }9 M4 @& h2 {

4 O6 @2 [& {6 I% a# Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 D9 y7 H6 o8 O$ V0 C# `unsigned int count_copy = 0;' Q7 ]' K) X/ c, s! A
- H# C: {- m' B) d* D
% V- G: W, E$ U
int main()1 i2 H! E6 j4 c2 ^
{
: j0 V+ Z& t) w$ @& F. ?        pRX_MSG_PROTOCOL pshreRAM = NULL;& V4 ^) m/ }9 V% }, D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" ^1 [6 A0 ]8 V0 [
- R- Q9 y! k( o3 \* p/ l. ?* E        while(1)% h! R6 \' f, @! X  @
        {
2 I6 b8 y& A3 `, F! I                read_MSG_buffer(pshreRAM);
" G& Z  Q; t7 L5 E5 w        }               
8 v8 s% _6 v3 g* {0 ?: i}9 f! ^* v% m& B8 B" _
2 B$ l7 ?# s2 [: P* Y& L# m0 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# J  K8 n9 U# f( ?{' S# i0 Y- o1 R) _* c/ A6 v
        RX_MSG_PROTOCOL buf;# }0 s& H5 V& z
        
( \% S# q2 O5 E  O6 ]+ c/ {        buf.a = pshreRAM->a;
5 T, p0 [. _+ `5 O# B7 y# n        buf.b = pshreRAM->b;- G- a2 k' V. m/ W/ ?
        buf.packet_cout = pshreRAM->packet_cout;
5 R- e) Y, k: q+ ]- c5 q8 E        
# q; j" L1 L8 c. r$ S( v4 t        if(buf.packet_cout != count_copy): v# j; x" _4 E  p3 K4 O# f
        {) T4 h: L8 r% ^) l- S, V' P7 ~
                printf("a is %d\n", buf.a);
) w4 g/ y) E- Y1 \                printf("b is %d\n", buf.b);: T' _6 j/ Y+ @, N9 \" Z' {
                printf("count is %d\n", buf.packet_cout);
* G7 X' F5 w, `3 H9 f- e                count_copy = buf.packet_cout;
, K2 ^) _/ g7 Q! C# b: r% @; M        }3 S9 ]3 X. H2 h; S0 L0 m, X0 f
        else: S" S! K; P0 D. k
        {
  c) r! O& ^5 V6 \* E                printf("No effective message!");
$ Z' F# k9 E! x' V7 v( a$ K        }2 J$ v5 Z& r$ s! \
}; N" f% J2 s9 S! T
  n4 l* [# B' F* m  E& Z7 w

7 ~6 S" P1 Q! Y但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。9 [& k# a9 n6 X  D
使用下面代码,对内存使用了mmap函数后:: e( X3 h& R/ Y' s& E  E
#include <stdio.h>
5 m& L  E, V$ d0 ^8 @3 G. r% }#include <unistd.h>% N% _$ H: }$ f" U. b: }
#include <sys/mman.h>
$ A9 ^4 V  L, J; d9 i#include <sys/types.h>
+ F1 f4 g9 _/ l7 K+ i$ g#include <fcntl.h>9 I, {5 l. x9 j- @. U$ f: Y8 U3 y; F4 G
* @% a* U( I1 l
#define SHAER_RAM_BASE_ADDR    (0x80000000)
& b$ v! V+ Z( X5 ~#define SHAER_RAM_SIZE         (0x20000)   % t8 L, N) ~4 Z) M
3 \  Z$ ^( o9 s9 R- [
typedef struct
; u3 B0 S2 k6 y0 Q# A3 T{: H& Y4 z7 ?2 n( ]$ \+ f% g; V
        unsigned int a;
( k6 L' r: w2 C- K  u        unsigned int b;9 q, i6 b1 o2 b) P5 F8 E
        unsigned int packet_cout;" J/ _+ j4 P' o1 L9 T: q' q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
' M& {1 I1 F  a/ O# V) B8 c* L' |4 R9 x" g8 H3 d9 o
void read_MSG_buffer(int *baseaddr);
- @4 \8 `8 R, ^- \( a0 q; Iunsigned int count_copy = 0;( a' l. }, E8 v/ Y+ }- v
" J6 Z) M, V% k7 h0 K8 b
int main()# |! X# A6 c7 C" f" J" X
{
! c/ e0 z6 G. t- `        int fd;' e' B% z% \9 o, m7 m
        int *mem = NULL;
2 Q! U: }1 k6 g' r* b9 g" v0 y; n) W* w: e0 D4 J) o
        if((fd = open("/dev/mem", O_RDWR)) <0)  P5 B& R- I' D3 v9 B9 q) o5 s
        {
/ E* ~6 t/ i* ^6 A                perror("open error");
. V; C' i0 z9 L& U& X( q# k                return -1;
% P, W- i0 B* {; d/ s* _        }" q  y8 F3 w0 V1 Z( H& w3 g! u
        
$ j' {" ~8 H* b  ^4 e1 \        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ t) r* \0 |- j5 B+ e
8 d+ |' }% n& H$ V0 u* C        while(1)
/ k5 D7 o& h8 S5 F" @# |% ?( H        {
( K) k& z* T2 F                read_MSG_buffer(mem);
9 ~# S/ @, d) Z+ u) @. B        }                % K! F) L1 F% H1 K1 \8 e9 E1 o
}- \) T6 x0 L7 o# |4 W1 }6 Q

( j# M5 s+ F* l% B) \  Tvoid read_MSG_buffer(int *baseaddr): J# m1 j3 C; m; s" N: U
{
" T# [1 V. `' t" z5 g9 g: d        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 x) A8 p: h3 I! n! A6 t9 U: {9 Q5 h; ~7 J- }# Q! G) ^
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
( q( |% G% f" f0 B- L1 _
) T  E1 `# Z- r' h        if(pshreRAM->packet_cout != count_copy)
! }4 j4 V0 F* z- \$ O/ [        {
8 S+ {: G1 H3 W+ L1 W; {                printf("a is %d\n", pshreRAM->a);
" V, a, E6 ^* |; l: A                printf("b is %d\n", pshreRAM->b);
( g9 [( k! S8 K) @6 D                printf("count is %d\n", pshreRAM->packet_cout);% @5 p  G/ {/ @/ ^
                count_copy = pshreRAM->packet_cout;
; u9 y* s0 @' J  z, a' {8 o+ F        }
" M& H/ C1 M/ _% c8 u" P6 Q        else4 `, A% \. F* G1 W6 p) O
        {
2 H9 n4 L. X3 t4 q% |                printf("No effective message!\n");
* ^% u6 n* T: V        }
: Y9 b( Q* v+ o* [# S" Y( C}
% O8 C  o! L$ K* _" K! x, z/ ]9 F  _( J+ Y  }! |7 \& X0 o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 R6 q, y5 D  c/ U8 @2 l2 a. s, b3 v
* W0 o# L& o$ M+ T- \  \1 H
3 f% d0 ], r( W3 n$ H7 t8 g* M
5 B+ u, c- E3 w$ ~; y4 X+ J& a8 I
; \  Y* Z  J& m! t; P. h( S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-4 04:37 , Processed in 0.048555 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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