OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 @5 M! l/ m0 B) k9 |' E# i+ t
- n6 m9 o! p/ M3 L: W! [! Z" k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>/ T3 P& B$ Y# M; Z) T% ^
#include <unistd.h>  T1 E2 b7 Z2 i
#include <sys/mman.h>; ]& o& K9 x$ y3 M- X' q
#include <sys/types.h>- ]% T1 U& V/ T( O  K3 ?
#include <fcntl.h>% D( P( H9 V1 O+ V# [! @" p5 f0 N7 x

' x1 c7 {( c* V#define SHAER_RAM_BASE_ADDR    (0x80000000)   8 q/ o8 b9 N: C# q7 \
3 @2 `7 D; y7 E% D6 \; U- Y
typedef struct/ t/ x+ N' s4 f
{
  I$ c' \% x8 j+ o# P6 M        unsigned int a;
/ V3 @% K  [! ^* r9 k" n8 V8 A        unsigned int b;
5 _4 w9 _* j/ e$ @$ u        unsigned int packet_cout;. X) @* q' Q: O8 z3 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" c+ n8 ^3 g" |9 [  l

  g$ R; e# ~, E* f& ?9 C( lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);4 a. [" T/ M1 z# l2 S% k
unsigned int count_copy = 0;; l  ~8 k# ~( o

) `& ~4 x9 r7 z1 C  N/ g5 f) x! ]9 U
int main()& t2 K. _6 A, ^( `7 r* C
{
- E; u- z+ ]+ x0 D; o# d6 T  p6 I        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ V, y$ E* O7 w: v  M! ?8 S: F        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# \( A* u5 D; c) d
9 K  V: ]9 C  ~( a/ e$ ]% z5 [1 ~
        while(1)! V. }4 k% n4 a' m7 R; O
        {* l4 c+ C* t( T; q% x4 H
                read_MSG_buffer(pshreRAM);8 }, d& x3 c/ S& }0 v8 O
        }               
9 T" H1 J4 P0 g9 X$ @}6 O* F/ I: W+ ~1 J# T6 ]

2 Z$ B+ k* ]1 ]0 L5 @* Nvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 J0 @6 I1 L( J/ r0 d# q/ Y
{) q& t6 y7 _: K' s' z' a  l  ~
        RX_MSG_PROTOCOL buf;
0 ~1 B8 [  E4 h1 {: x: @5 ?        
  @+ l" `6 l4 x6 o& }) q/ X        buf.a = pshreRAM->a;
7 ?- N  A+ L) v0 O        buf.b = pshreRAM->b;9 J; s0 P$ }. N
        buf.packet_cout = pshreRAM->packet_cout;
7 C* \. r: V' m: g. s; C3 Z        
; E( K9 _/ b1 {) W+ V1 N& S        if(buf.packet_cout != count_copy), M4 F4 V! A" U7 Q' i" k
        {: ^- v! f2 ?  A8 l+ J0 @; x$ M
                printf("a is %d\n", buf.a);
9 j3 p3 M% H5 L                printf("b is %d\n", buf.b);# j- |' P7 _# S3 g# L. @9 B
                printf("count is %d\n", buf.packet_cout);& g/ b, ?. ^: s* G8 r* C# A* k1 n
                count_copy = buf.packet_cout;
) W" i" U' j" S* q; ^; ]% i        }
. j1 }- R1 O1 g/ W( N' }7 S        else4 W1 t- @# n2 g1 r! z* M' J
        {( \9 d# t% ]; [' m
                printf("No effective message!");* }; l  t2 d6 Z6 @. Y+ h0 r" ]
        }( H# W2 a' u/ Y" S& ~
}# s" D% x7 v. z" e! s% Z

) `% I8 M" J4 E1 O
! C( h9 _) E3 |3 |5 Y* a$ B) U, }但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& O9 W/ K' G( ]0 }6 b& C' S
使用下面代码,对内存使用了mmap函数后:
% ?  z$ U6 _9 _$ R/ o5 u8 Q" N#include <stdio.h>% J0 P: |8 ~& ^$ H) U/ q5 }, T
#include <unistd.h># `/ V  j% w' F$ z/ \
#include <sys/mman.h>( T( F9 F- s! e+ ~% n
#include <sys/types.h>' G, j. v; U5 V1 Y& v1 N/ v" F
#include <fcntl.h>
: W# N: x" \! y4 q. Y! F" u9 j! y/ Z' k' {4 N+ w% h
#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 Y: i$ z$ _7 b+ K#define SHAER_RAM_SIZE         (0x20000)   
( x; ^# F/ N0 ?6 V( v& b9 V5 i4 c
3 t8 ?' R% `! H& D* Z! E% jtypedef struct; n) G" D2 S& B2 F+ |! u3 X) g
{# ~0 U; \" C$ h: ^9 N' W3 L% t
        unsigned int a;6 Z6 v% L$ M6 z  \& X, ^
        unsigned int b;
9 H5 R. W% M! z, c        unsigned int packet_cout;
  N& b* n6 b- @) X* o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) l3 v7 d5 }) y1 l! t

5 D# X7 g  r1 g5 k& D2 {- V* Gvoid read_MSG_buffer(int *baseaddr);3 R# J, w0 V3 a; z* ?
unsigned int count_copy = 0;2 s% U5 R/ @% G9 h

  A* ?) Q' l1 Qint main()! R2 K& S0 I2 v3 O: E+ z
{
0 l- z" X7 z0 h/ m) l1 k        int fd;7 Y1 w5 c( a, W1 K. P
        int *mem = NULL;/ Z" A* q6 e, X

8 A7 X1 _$ e. ?( I' S        if((fd = open("/dev/mem", O_RDWR)) <0)5 w6 q, A$ Q* U' A  [
        {
+ V9 V1 l/ }, P" _! O                perror("open error");
2 S2 u6 A" k8 H+ i                return -1;6 O: U. f" n' V: T/ f" H1 s
        }1 e* S3 _0 z5 Q6 Z) c
        8 T9 v1 E8 F0 |
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( m. N" }3 {; Z9 Y4 F2 Y( A5 s* |

) w/ x- \) e( Z' \        while(1): z. d& E; N6 a, G' N# a* ?
        {) I) M/ ?0 v$ M7 F1 y
                read_MSG_buffer(mem);( f; U, `' o- X5 d
        }               
8 V) {$ E7 V9 W8 {5 o}# m( L% I7 \+ X% V
- k. q& _# S) _# v' q8 N7 a
void read_MSG_buffer(int *baseaddr)
* ?0 r; X$ G( x$ I0 ?" r! e' \{
$ x* p( l) _$ c& f" ^        pRX_MSG_PROTOCOL pshreRAM = NULL;5 y: R0 }+ `7 }0 h5 E& t
3 H3 U9 C9 \, ~' a
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ s9 e  m0 Z; h4 ~5 L: l2 X! O9 M- l% g6 j7 Y$ p( @- e
        if(pshreRAM->packet_cout != count_copy)
3 w. M; h/ _9 a7 s) w        {
# m5 O* H0 k0 M" \5 v                printf("a is %d\n", pshreRAM->a);2 h; y0 o* o6 k7 |& a
                printf("b is %d\n", pshreRAM->b);
8 w0 a8 u( Y0 m! _# l* Z                printf("count is %d\n", pshreRAM->packet_cout);
; y0 n8 {! f: F3 [/ k, a3 ]                count_copy = pshreRAM->packet_cout;, C( b' N; @3 A- ]+ R
        }
6 N0 H* ]6 t1 [# I# N( T. }3 o/ s: q/ o  b        else
4 ^# f5 U  t; w. |2 V        {
/ y" G: M! c$ [5 g! _& t" W( G                printf("No effective message!\n");4 u) V7 G7 b5 `0 S
        }
  I  f0 I" j8 n$ e. n; y5 {. k0 L}3 S; E+ u" V2 g4 p) i3 C. W! V

! _' d2 i& i: [3 U没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( o8 p' c( ~& {  n- p) ~% A* j
. m- @7 m# @' x8 M- i8 K4 C  W" L( N0 O* B1 C, I8 L! U0 V7 _  U

1 d* B: D8 Y0 P, m
  |8 K% k$ ?7 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 12:15 , Processed in 0.036352 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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